객체 지향의 흔한 오해로는 상속을 부모-자식 개념, 계층도-조직도 개념으로 생각한다는 것이다.
하지만 객체 지향의 상속은 위의 그림의 상속이 아닌 재사용과 확장
으로 이해하는 것이 맞다. 다음 그림처럼 분류도로 이해해야 한다.
객체 지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속)하고 거기에 대해 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미다.
따라서 상속을 부모 클래스 - 자식 클래스라고 표현하기 보다는 상위 클래스 - 하위 클래스 또는 슈퍼 클래스 - 서브 클래스로 표현하는 것이 맞다. 그리고 상위 클래스 쪽으로 갈수록 추상화, 일반화
됐다고 말하며, 하위 클래스 쪽으로 갈수록 구체화, 특수화
됐다고 말한다.
상속 관계에서 반드해 만족해야 할 문장이 있다.
- 하위 클래스는 상위 클래스다.
위의 문장은 로버트 C. 마틴이 주장한 객체 지향 설계 5원칙 가운데 LSP(리스코프 치환 원칙)
를 나타내는 말이다.
위의 분류도의 경우를 보면 다음과 같이 표현할 수 있다.
자바 언어를 보아도 inheritance(상속)라는 키워드는 존재하지 않고 대신 extends(확장)
가 존재한다.
위에서 상속관계를 만족하는 문장은 "하위 클래스는 상위 클래스"라고 했다. 즉, 하위 클래스의 객체를 상위 클래스로 선언할 수 있는 것이다.
그렇다면 다음과 같이 코드를 작성할 수도 있을 것이다.
동물.java
package inheritance01;
public class 동물 {
String myClass;
동물() {
myClass = "동물";
}
void showMe() {
System.out.println(myClass);
}
}
포유류.java
package inheritance01;
public class 포유류 extends 동물 {
String myClass;
포유류() {
myClass = "포유류";
}
}
조류.java
package inheritance01;
public class 조류 extends 동물 {
String myClass;
조류() {
myClass = "조류";
}
}
고래.java
package inheritance01;
public class 고래 extends 포유류 {
String myClass;
고래() {
myClass = "고래";
}
}
박쥐.java
package inheritance01;
public class 박쥐 extends 포유류 {
String myClass;
박쥐() {
myClass = "박쥐";
}
}
참새.java
package inheritance01;
public class 참새 extends 조류 {
String myClass;
참새() {
myClass = "참새";
}
}
펭귄.java
package inheritance01;
public class 펭귄 extends 조류 {
String myClass;
펭귄() {
myClass = "펭귄";
}
}
package Class Driver01 {
public static void main(String[] args) {
동물 animal = new 동물();
포유류 mammalia = new 포유류();
조류 bird = new 조류();
고래 whale = new 고래();
박쥐 bat = new 박쥐();
참새 sparrow = new 참새();
펭귄 penguin = new 펭귄();
animal.showMe();
mammalia.showMe();
bird.showMe();
whale.showMe();
bat.showMe();
sparrow.showMe();
penguin.showMe();
}
}
상위 클래스에서만 showMe() 메서드를 구현했지만 모든 하위 클래스의 객체에서 showMe() 메서드를 사용할 수 있다. 상속한다는 것이 이렇게 상위 클래스의 특성을 상속한다는 의미이지 부모-자식 관계는 아니다. 하위 클래스에서 showMe() 메서드를 다시 작성하지 않아도 된다는 것이다.
package Class Driver02 {
public static void main(String[] args) {
동물 animal = new 동물();
동물 mammalia = new 포유류();
동물 bird = new 조류();
동물 whale = new 고래();
동물 bat = new 박쥐();
동물 sparrow = new 참새();
동물 penguin = new 펭귄();
animal.showMe();
mammalia.showMe();
bird.showMe();
whale.showMe();
bat.showMe();
sparrow.showMe();
penguin.showMe();
}
}
"하위 클래스는 상위 클래스다"를 코드에서 이렇게 표현할 수 있는 것이다.
package Class Driver03 {
public static void main(String[] args) {
동물[] animals = new 동물[7];
animals[0] = new 동물();
animals[1] = new 포유류();
animals[2] = new 조류();
animals[3] = new 고래();
animals[4] = new 박쥐();
animals[5] = new 참새();
animals[6] = new 펭귄();
for (int index = 0; index < animals.length; index++) {
animals[index].showMe();
}
}
}
참고