1. 상속(inheritance)이란?
기존의 클래스를 재사용하여
새로운 클래스를 작성하는 것
상속을 통해, 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있다.
→ 클래스 이름 뒤에 상속받고자 하는 클래스의 이름과 그 앞에 키워드 'extends'만 붙여주면 된다.
class Child extends Parent {
// Child 클래스가 Parent 클래스를 상속 받았다.
}
2. 조상 클래스와 자손 클래스
위의 두 클래스는 서로 상속 관계에 있다고 한다.
상속해주는 클래스를 '조상 클래스', 상속 받는 클래스를 '자손 클래스'라 한다.
조상 클래스 : 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
자손 클래스 : 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스
서로 상속관계에 있는 두 클래스를 그림으로 표현하면 다음과 같다.
class Parent {}
class Child extends Parent {}
자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
따라서 Child 클래스는 Parent 클래스의 멤버들을 포함한다고 할 수 있다.
만일 Parent 클래스에 age라는 정수형 변수를 멤버변수로 추가하면, 자손 클래스는 조상의 멤버를 모두 상속받기 때문에 Child 클래스는 자동적으로 age라는 멤버변수가 추가되는 효과를 얻는다.
class Parent {
int age;
}
class Child extends Parent {}
이번엔 반대로 자손인 Child 클래스에 새로운 멤버로 play() 메서드를 추가해 보았다.
자손 클래스에 추가된 멤버는 조상 클래스에 아무런 영향을 미치지 못한다.
class Parent {
int age;
}
class Child extends Parent {
void play() {
System.out.println("놀자~");
}
}
자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다.
즉, 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어난다.
- 상속의 특징
1) 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
2) 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
* 상속을 받는다는 것은 조상 클래스를 확장(extends)한다는 의미로 해석할 수도 있다. 그래서 키워드가 'extends'!
3. 클래스 간의 상속 관계
이번엔 Parent 클래스로부터 상속받는 Child2 클래스를 새로 생성해보았다.
class Parent {}
class Child extends Parent {}
class Child2 extends Parent {}
클래스 Child와 Child2 모두 Parent 클래스를 상속받고 있다. Child와 Parent, Child2와 Parent는 상속관계에 있지만, Child와 Child2 간에는 아무 관계가 성립하지 않는다.
→ Parent 클래스에 새로운 멤버를 추가하면 Child와 Child2 모두 추가하는 효과를 얻는다.
→ 클래스 간의 관계에서 형제 관계 같은 건 없다. 오직 부모와 자식의 관계(상속관계)만이 존재한다.
→ 이러한 상속관계를 이용해서 코드의 중복을 최소화 할 수 있다.
여기에 또다시 Child 클래스로부터 상속받는 GrandChild라는 클래스를 추가하면 다음과 같아진다.
class Parent {}
class Child extends Parent {}
class Child2 extends Parent {}
class GrandChild extends Child {}
자손 클래스는 조상 클래스의 모든 멤버를 물려받으므로 GrandChild는 Child의 조상인 Parent의 멤버까지 상속받게 된다. GrandChild에게 Child 클래스는 '직접 조상'이고, Parent 클래스는 '간접 조상'이 된다.
Parent 클래스에 정수형 변수인 age를 추가하면 아래와 같다.
class Parent {
int age;
}
class Child extends Parent {}
class Child2 extends Parent {}
class GrandChild extends Child {}
Parent 클래스는 클래스 Child, Child2, GrandChild의 조상이므로 멤버변수 age는 Parent의 모든 자손에게 추가된다. 반대로 Parent 클래스에서 멤버변수 age를 제거 한다면, 모든 자손 클래스에서도 제거된다.
→ 조상 클래스만 변경해도 모든 자손 클래스에, 자손의 자손 클래스에까지 영향을 미친다.
→ 클래스의 상속 관계를 맺어 주면 자손 클래스의 공통적인 부분은 조상 클래스에서 관리하면 된다.
- 상속에 대해 알아두면 좋은 내용
- 자손의 인스턴스를 생성하면 조상과 자손의 클래스 멤버가 합쳐진 하나의 인스턴스로 생성
- 자손은 부모를 알지만, 부모는 자손을 모른다.
참고문헌 : 남궁성(2016), Java의 정석, 도우출판