상속 (Inheritance)
상위 클래스를 상속받아서 하위 클래스를 정의하는 방법이다.
자바에서는 오로지 하나의 부모로부터만 상속받을 수 있다. 다중 상속은 허용되지 않는다.
상속을 사용하면 기존에 있는 객체를 그대로 활용하면서 새로운 객체에서 추가되거나 변경되는 부분만 작성하면 되므로 소프트웨어 개발 효율을 높일 수 있다.
Sub Class(하위 클래스)에서는 Super Class(상위 클래스)가 가지고 있는 멤버 변수들을 선언하지 않아도 사용할 수 있다.
따라서 상위 클래스에 없는 멤버 변수만 선언하면 된다.
예제 1 - 상속 사용 안 함
BasicTV.java
public class BasicTV {
boolean isPowerOn;
int channel;
int volume;
public void displayInfo() {
System.out.println("----- TV 현재 상태 -----");
System.out.println("전원 : " + isPowerOn);
System.out.println("채널 : " + channel);
System.out.println("볼륨 : " + volume);
}
}
SmartTV.java
public class SmartTV extends BasicTV {
boolean isPowerOn;
int channel;
int volume;
String ip;
public void displayInfo() {
System.out.println("----- TV 현재 상태 -----");
System.out.println("전원 : " + isPowerOn);
System.out.println("채널 : " + channel);
System.out.println("볼륨 : " + volume);
System.out.println("IP 주소 : " + ip);
}
}
SmartTV.java의 코드는 BasicTV.java의 코드와 매우 유사하다.
String ip 필드가 추가되고, displayInfo() 메소드만 조금 수정되었다.
Main.java
public class Main {
public static void main(String[] args) {
BasicTV tv1 = new BasicTV();
tv1.isPowerOn = true;
tv1.volume = 10;
tv1.channel = 5;
tv1.displayInfo();
System.out.println();
SmartTV tv2 = new SmartTV();
tv2.isPowerOn = true;
tv2.channel = 123;
tv2.volume = 12;
tv2.ip = "192.168.0.111";
tv2.displayInfo();
}
}
실행 결과
BasicTV.java와 SmartTV.java 코드는 거의 유사하므로 이런 경우 상속을 이용하는 게 좋다.
예제 2 - 상속 사용
BasicTV.java
public class BasicTV {
boolean isPowerOn;
int channel;
int volume;
public void displayInfo() {
System.out.println("----- TV 현재 상태 -----");
System.out.println("전원 : " + isPowerOn);
System.out.println("채널 : " + channel);
System.out.println("볼륨 : " + volume);
}
}
SmartTV.java
public class SmartTV extends BasicTV {
String ip;
public void displayInfo() {
super.displayInfo();
System.out.println("IP 주소 : " + ip);
}
}
이번에는 SmartTV가 BaiscTV를 상속했으므로 BasicTV.java와 SmartTV.java에서 겹치는 멤버 변수(isPowerOn, channel, volume)는 작성하지 않아도 사용할 수 있다.
또한 상속받은 클래스 내에 displayInfo() 메소드가 있으므로 SmartTV.java의 displayinfo() 메소드 내에서 super.displayInfo(); 를 사용하면 상속받은 클래스의 메소드 내용을 그대로 사용할 수 있다.
super는 상속받은 클래스의 메소드 이름과 현재 클래스에서 사용하려는 메소드 이름이 똑같기 때문에 사용하는 것이다.
부모-자식 간의 관계 같은, 겹치는 부분이 많이 존재하는 경우 상속을 유용하게 사용하면 코딩을 효율적으로 할 수 있고 유지보수하기에도 용이하다. 자바에서 상속은 거의 필수로 사용된다고 볼 수 있다.
Main.java
public class Main {
public static void main(String[] args) {
BasicTV tv1 = new BasicTV();
tv1.displayInfo();
System.out.println();
SmartTV tv2 = new SmartTV();
tv2.isPowerOn = true;
tv2.channel = 100;
tv2.volume = 10;
tv2.ip = "192.168.0.110";
tv2.displayInfo();
}
}
실행 결과
tv1을 생성하고 난 후 isPowerOn, channel, volume 값을 설정하지 않았기 때문에 기본 값인 false와 0 값으로 되어있다.
자동 타입 변환(Promotion)
아래와 같은 경우에서는 자동 타입 변환이 발생한다.
BasicTV tv = new SmartTV();
자식 클래스 타입이 부모 클래스로 자동 타입 변환이 된다.
타입 변환은 되나, 부모 객체(BasicTV)를 참조하지 않고 자식 객체(SmartTV)를 참조한다.
부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메서드에만 접근이 가능하다. 변수는 자식 객체를 참조하나, 접근 가능한 멤버는 부모 클래스의 멤버로 제한되는 것이다.
예외가 있긴하다. 만약 자식 클래스에서 오버라이딩 된 메서드가 있다면 이는 자식 클래스의 메서드가 호출된다.
관련 글