Java 상속(Inheritance)
Java 상속(Inheritance)
- 기존의 클래스를 재사용하여 새로운 클래스를 생성하기 위한 방법
- 부모와 자식 클래스의 관계를 표현해 상속됨을 표시
- 자식 클래스는 부모 클래스의 모든 맴버를 상속 받는다.
- 상속을 받을 때에는 extends 키워드를 사용한다.
public class DmbCellPhone extends CellPhone
과 같이 자식 클래스를 생성할 떄extends 부모 클래스명
으로 부모임을 명시한다.extends
로 부모클래스로 부터 상속받게 되면 부모 클래스 내에 있는 모든 객체 및 메소드를 사용할 수 있다.
오버라이딩(Overriding)
- 부모 클래스에 정이된 것과 동일한 시그니처(리턴타입, 메소드이름, 매개변수 리스트)를 가진 메소드를 자식클래스에서 똑같이 정의하는 것을 오버라이딩이라 한다.
- 자식 클래스에서 해당 메소드를 호출하게 되면 부모가 아닌 자신(자식)의 메소드를 호출하게 됨.
- 추가적으로 super.메소드명()으로 자식클래스에서 호출하게 되면 부모의 메소드를 호출하게 된다.
- 자식 클래스에서 @Override는 꼭 쓸필요 있는 것은 아니지만 헷갈리지 않게 하기 위해 작성한다.
CellPhone.java (부모클래스)
public class CellPhone {
// 필드
String model;
String color;
// 생성자
// 메소드
void phoneStatus() {
System.out.println("model : " + this.model);
System.out.println("color : " + this.color);
}
void powerOn() { System.out.println("Power On"); }
void powerOff() { System.out.println("Power Off"); }
void bell() { System.out.println("bell"); }
void sendVoice(String message) { System.out.println("Send : " + message); }
void receiveVoice(String message) { System.out.println("Receive : " + message); }
// 오버라이딩(Overriding)
void changeModel(String model) {
System.out.println("Parents Class Method");
this.model = model;
phoneStatus();
}
}
DmbCellPhone.java (자식클래스)
public class DmbCellPhone extends CellPhone {
// 필드
int channel;
// 생성자
DmbCellPhone(String model, String color, int Channel){
this.model = model;
this.color = color;
this.channel = channel;
}
// 메소드
void turnOnDmb() {
System.out.println("Turn on Dmb. Channel : " + channel);
}
void changeChannelDmb(int channel) {
this.channel = channel;
System.out.println("Change Channel to " + channel);
}
void turnOffDmb() {
System.out.println("Turn off Dmb");
}
// 오버라이딩(Overriding)
@Override
void changeModel(String model) {
if (model == "super") {
super.changeModel(model);
} else {
System.out.println("Child Class Method");
this.model = model;
phoneStatus();
}
}
}
DmbCellPhoneExample.java (자식클래스로 객체 생성 및 사용)
public class DmbCellPhoneExample {
public static void main(String[] args) {
// DmbCellPhone 객체 생성
DmbCellPhone dmbCellPhone = new DmbCellPhone("PhoneName", "PhoneColor", 10);
// CellPhone으로 부터 상속 받은 필드
System.out.println("model : " + dmbCellPhone.model);
System.out.println("color : " + dmbCellPhone.color);
// DmbCellPhone의 필드
System.out.println("channel : " + dmbCellPhone.channel);
// CellPhone으로부터 상속 받은 메소드 호출
dmbCellPhone.powerOn();
dmbCellPhone.bell();
dmbCellPhone.sendVoice("Hello");
dmbCellPhone.receiveVoice("Nice to meet you.");
// DmbCellPhone의 메소드 호출
dmbCellPhone.turnOnDmb();
dmbCellPhone.changeChannelDmb(5);
dmbCellPhone.turnOffDmb();
// Override 한 메소드 호출
dmbCellPhone.phoneStatus();
dmbCellPhone.changeModel("PhoneName2");
dmbCellPhone.changeModel("super");
}
}
결과
model : PhoneName
color : PhoneColor
channel : 0
Power On
bell
Send : Hello
Receive : Nice to meet you.
Turn on Dmb. Channel : 0
Change Channel to 5
Turn off Dmb
model : PhoneName
color : PhoneColor
Child Class Method
model : PhoneName2
color : PhoneColor
Parents Class Method
model : super
color : PhoneColor
Final Class
final로 정의된 클래스는 부모클래스가 될 수 가 없음 따라서 extends 사용 불가
public final class 클래스명 { ... }
// 오류 final 정의로 인한 상속 불가
public class new클래스 extends 클래스명 {...}