Java 상속(Inheritance)

Java 상속(Inheritance)

  1. 기존의 클래스를 재사용하여 새로운 클래스를 생성하기 위한 방법
  2. 부모와 자식 클래스의 관계를 표현해 상속됨을 표시
  3. 자식 클래스는 부모 클래스의 모든 맴버를 상속 받는다.
  4. 상속을 받을 때에는 extends 키워드를 사용한다.

Inheritance

  • 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 클래스명 {...}