❯ 상속(Inheritance)
상속
기존 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소.
하위 클래스는 상위 클래스가 가진 모든 멤버를 상속 받음(서로 상속관계에 있다고 하며, 상위 클래스로부터 확장되었다고도 표현함)
⇒ 상위 클래스의 코드를 재사용함으로써 적은 양의 코드로 새로운 코드(하위 클래스) 작성 가능. 코드의 중복을 제거함
하나의 객체가 여러가지 모양으로 표현 가능하므로 다형적 표현이 가능해짐
자바에서는 단일 상속만을 허용함. [extends + 상위 클래스명]으로 정의함 ex. class Teacher extends Person
포함 관계
포함(composite)은 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는것을 의미
다른 클래스를 재사용한다는 점에서 상속과 유사함. 실무에서는 포함관계를 쓰는 경우가 많음
상속: "A는 B이다" 관계에서 주로 사용 ex. sportscar - car 관계 (스포츠카는 자동차이다)
포함: "A는 B를 가지고 있다" 관계에서 주로 사용 ex. person - address 관계 (선생님은 주소를 가지고 있다)
메서드 오버라이딩(Method Overriding)
상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는것을 의미함
하위 클래스에 메서드를 재정의함으로써 동일한 이름의 메서드라도 클래스에 따라 다르게 호출할 수 있음
<오버라이딩의 조건>
- 메서드의 선언부(메서드 이름, 매개변수, 반환타입)가 상위클래스의 그것과 완전 일치해야함
- 접근 제어자의 범위가 상위 클래스 메서드보다 같거나 넓어야함
- 예외는 상위 클래스 메서드보다 많이 선언할 수 없음 -> 추후 학습 예정
super 와 super( )
this. this( ) 두가지가 다른것처럼 super. super( )는 다른 역할을 함
- super : 상위 클래스의 객체를 호출함. 상위 클래스와 하위 클래스의 변수명이 같을 때 이 둘을 구분하기 위해 super.를 사용함
super 사용 시 상위 객체의 멤버값을 참조하고, 사용하지 않을 경우 자신이 속한 인스턴스의 멤버값을 참조함 - super( ) : 상위 클래스의 생성자를 호출함. this( )와 마찬가지로 생성자 내에서 가장 첫줄에 사용 가능함
하위 클래스의 인스턴스를 생성하면 상위 클래스의 멤버도 포함되어있음.
따라서 상위 클래스 멤버 초기화를 위해서는 반드시 상위 클래스의 생성자까지 호출이 되어야함.
만약 하위 클래스에 상위 클래스 생성자가 없을 경우 자바 컴파일러에 의해 자동으로 super( )가 생성됨.
만약 이때 상위 클래스에 기본 생성자가 없다면(매개변수를 활용한 다른 생성자가 있다면) 기본 생성자를 호출할 수 없으므로
오류가 발생함. ⇒ 클래스 생성시 기본 생성자 작성을 습관화 해야하는 이유!
Object 클래스
자바 클래스 상속 계층도에서 가장 최상위에 위치한 상위 클래스.
"자바의 모든 클래스는 Object 클래스로부터 확장된다"는 항상 참.
자바 컴파일러는 아무것도 상속받지 않는 클래스에는 자동으로 extends Object 를 추가하여 Object 를 상속받도록 함.
(Object의 클래스 멤버들을 자동으로 상속받아서 사용할 수 있음. ex. toString(), equals(), wait() 등)
❯ 캡슐화(Encapsulation)
특정 객체 안에 관련된 속성과 기능을 캡슐로 만들어 데이터를 외부로부터 보호하는것.
데이터를 보호하고 내부적으로만 사용되는 데이터의 불필요한 외부 노출을 방지함 (정보 은닉 효과)
캡슐화를 위해서는 접근 제어자를 사용하고, getter setter 메서드를 사용해 이를 활용할 수 있음
패키지
특정 목적을 공유하는 클래스와 인터페이스의 묶음.
클래스를 그룹 단위로 묶어서 관리하는 것으로, 폴더를 만들어 관련된 파일들을 묶어서 정리하는것과 유사함
패키지는 하나의 디렉토리로 계층구조를 가지며 점(.)을 사용해 계층을 구분함
ex. java.lang(기본 클래스 모아놓은것), java.util(확장 클래스 모아놓은것) 등
패키지가 있는 경우 소스코드 첫번째 줄에 반드시 [package + 패키지명]을 기재함.
- import 문: 다른 패키지 내의 클래스를 사용하기 위해 사용. 패키지 구문과 클래스 구문 사이에 주로 작성함
import 사용시 호출 방식에 따라 해당 패키지의 특정 클래스 혹은 모든 클래스를 사용할 수 있음
import 문은 컴파일시에 처리되므로 프로그램의 성능에는 영향을 주지 않는다.
접근 제어자
제어자(Modifier)란 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드를 의미함 (형용사 역할과 유사)
접근 제어자와 기타 제어자(static, final, abstract 등) 두 가지로 구분됨
접근제어자 | 클래스 내 | 패키지 내 | 다른 패키지의 하위클래스 (상속받은 자식클래스) |
패키지 외 | 접근 제한 범위 |
public | O | O | O | O | 접근 제한 없음 |
protected | O | O | O | X | 동일 패키지+다른패키지 하위클래스에서 가능 |
default | O | O | X | X | 동일 패키지 내에서 가능 |
private | O | X | X | X | 동일 클래스에서만 가능 |
하나의 대상에 대해서 여러 제어자를 사용(ex. public static final)할 수 있으나, 각 대상에 대한 접근 제어자는 한번만 사용가능
getter와 setter 메서드
캡슐화의 목적(데이터 보호와 은닉)을 달성하면서도 데이터 변경과 참조가 필요한 경우, getter와 setter 메서드를 사용할 수 있음
- setter 메서드: 외부에서 메서드에 접근해서 조건에 맞으면 데이터 값을 변경 가능하게 함. 메서드 명에 set- 붙여서 주로 사용.
ex. private String name; // private 이므로 원래는 외부에서 접근 불가.
public void setName(String name){this.name;} // setter 메서드 사용하여 외부에서 name 값 변경 가능 - getter 메서드: setter 메서드를 사용해 설정한 변수값을 읽어오는데 사용. 메서드 명에 get- 을 붙여서 정의함
getter 와 setter 메서드를 사용해서 데이터를 보호하면서도 의도하는 값으로 변경 및 활용이 가능함
참고자료
지난주까지 객체지향과 관련된 기본적인 내용을 다루고, 이번주부터는 조금 더 심화 내용을 진행하게 되었다.
오늘의 수업 역시 직접 코드를 작성해보고 동작시켜보면서 그 원리를 파악하는것이 중요했다.
각 단위 주제별로 실습은 진행해서 비교적 간단했으나 향후 프로젝트들을 하게되면 헷갈릴것같기도하다.
다행히 이번주에는 공휴일도 있어서 확실히 한번 더 복습하는 시간을 갖고 다음 단계로 넘어가야겠다.
'부트캠프 개발일기 > Java' 카테고리의 다른 글
13일차: 미니 프로젝트(얕은복사 vs 깊은복사) (0) | 2023.03.02 |
---|---|
12일차: 객체지향 프로그래밍 심화(다형성/Polymorphism, 추상화/Abstraction) (0) | 2023.02.28 |
10일차: 객체지향 프로그래밍 기초(생성자, 내부클래스) (0) | 2023.02.24 |
9일차: 객체지향 프로그래밍 기초(Class, Field, Method) (0) | 2023.02.23 |
8일차: Java 기초(배열) (0) | 2023.02.22 |