1. 상속(Inheritance)
: 기존의 클래스에 기능을 추가하거나 새로운 클래스를 정의하는 것을 의미하며, 부모 클래스(상위 클래스)의 멤버를 자식 클래스(하위 클래스 or 파생 클래스)에게 물려줄 수 있다.
*상속의 장점
- 기존에 작성된 클래스를 재사용할 수 있다.
- 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않아도 된다.
- 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련한다.
※상속 주의 사항
: 상속을 해도 부모 클래스의 모든 필드와 메소드들을 물려받는 것이 아니라 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
또한, 부모 클래스와 자식 클래스가 다른 패키지에 존재하면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다.
-자식 클래스 상속
class childClass extends parentClass {
// 필드
// 생성자
// 메소드
}
-> 어떤 부모 클래스를 상속받을 것인지를 결정하고 선택된 부모 클래스는 extends 뒤에 기술해준다. 자바는 다른 언어와 달리 다중 상속을 허용하지 않기 때문에 extends 뒤에는 단 하나의 부모 클래스만 와야 한다.
예제)
/* 부모 클래스 */
public class CellPhone {
// 필드
String model;
String color;
// 생성자
// 메소드
void powerOn() { System.out.println("전원 On"); }
void powerOff() { System.out.println("전원 Off"); }
void sendVoide(String message) { System.out.println("나 : " + message); }
void hangUp() { System.out.println("HangUp"); }
}
/* 자식 클래스 */
public class DmbCellPhone extends CellPhone {
// 필드
int channel;
// 생성자
DmbCellPhone(String model, String color, String channe) {
this.model = model;
this.color = color; // model, color는 부모 클래스로부터 상속받은 필드
this.channel = channel;
}
// 메소드
void turnOnDmb() {
System.out.println("채널 " + channel + "번 DMB 방송 수신");
}
}
* 상속받은 자식 클래스 사용
public class DmbCellPhoneExample {
public static void main(String[] args) {
// DmbCellPhone 객체 생성
DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);
// CellPhone으로부터 상속받은 필드
System.out.println("모델: " + dmbCellPhone.model);
System.out.println("색상: " + dmbCellPhone.color);
// DmbCellPhone의 필드
System.out.println("채널: " + dmbCellPhone.channel);
// CellPhone으로부터 상속받은 메소드 호출
dmbCellPhone.powerOn();
dmbCellPhone.sendVoice("여보세요");
dmbCellPhone.hangUp();
// DmbCellPhone의 메소드 호출
dmbCellPhone.turnOnDmb();
}
}
-부모 생성자 호출
DmbCellPhone dmbCellPhone = new DmbCellPhone();
-> dmbCellPhone 객체만 생성한 것처럼 보이지만 부모 객체인 CellPhone 객체가 먼저 생성되고, DmbCellPhone 객체가 생성된다.
※super 키워드와 super();
super : 자신을 가리키는 키워드가 this였다면, 부모를 가리키는 키워드는 super이다.
super() : 부모의 생성자를 의미하며, 부모의 생성자를 임의로 호출하지 않으면 부모 class의 기본 생성자가 자동으로 호출된다.
-> super 키워드는 자식에서 부모의 메소드나 필드를 사용할 때도 사용한다.
-메소드 오버라이딩(method overriding)
: 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의 하는 것을 말한다.
메소드가 오버라이딩 되면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드 호출 시 오버라이딩된 자식 메소드가 호출된다.
※메소드 오버라이딩의 조건
- 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다.
- 접근 제한을 더 강하게 오버라이딩할 수 없다
- 새로운 예외(Exception)를 throws할 수 없다.
-다형성
: 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질로 다형성을 위해 자바는 부모 클래스로 타입 변환을 허용한다. 즉, 부모 타입에 모든 자식 객체가 대입될 수 있다
-자동 타입 변환(Promotion)
: 자식은 부모의 특징과 기능을 상속받기 때문에 동일하게 취급될 수 있다.
ex)
class Animal{ ... } // 부모 클래스
class Cat extends Animal { ... }
Animal 클래스(부모)와 Cat 클래스가 상속 관계에 있다면
Cat = cat = new Cat();
Animal animal = cat; // or Animal animal = new Cat();도 가능
-> Cat 클래스로부터 Cat 객체를 생성하고 이것을 Animal 변수에 대입하면 자동 타입 변환이 일어난다.
*부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
'Programming > JAVA' 카테고리의 다른 글
자바의 인터페이스 (0) | 2020.01.09 |
---|---|
자바의 추상 클래스 (0) | 2020.01.07 |
자바의 접근 제한자 (0) | 2019.12.30 |
자바의 클래스 (0) | 2019.12.27 |
자바의 참조 타입과 배열 (0) | 2019.12.23 |