1. 상속의 정의
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다. 때문에 상속은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
2. 상속 구현 방법
상속을 구현하기 위해선 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써 주기만 하면 된다.
class Child extends Parent {
// ...
}
이 두 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 '조상 클래스'라 하고 상속 받는 클래스를 '자손 클래스'라 한다.
* 서로 상속관계에 있는 두 클래스를 아래와 같은 용어로 표현하기도 한다.
- 조상 클래스 : 부모 클래스, 상위 클래스, 기반 클래스
- 자손 클래스 : 자식 클래스, 하위 클래스, 파생된 클래스
그리고 서로 상속관계에 있는 두 클래스를 그림으로 표현하면 다음과 같다.
위 그림은 클래스를 타원으로 표현하고 클래스간의 상속 관계는 화살표로 표시한 것이다. 이와 같이 클래스 간의 상속관계를 그림으로 표현한 것을 '상속계층도' 라고 한다.
3. 상속의 특징
상속이라고 해서 자손 클래스가 조상 클래스로부터 모든걸 상속 받는 것은 아니다. 그럼 범위가 어디까지인 것일까? 살펴보자.
1) 멤버변수는 모두 상속
자손 클래스는 조상 클래스의 모든 멤버를 상속받는다. 클래스는 멤버의 집합이므로 조상 클래스와 자손 클래스를 다음과 같이 표현할 수 있다.
만일 조상클래스에 age라는 정수형 변수를 멤버변수로 추가한다면 자손 클래스는 조상 클래스의 멤버를 모두 상속받기 때문에, 자손 클래스에는 자동적으로 age라는 멤버변수가 추가된 것과 같은 효과를 얻는다.
class Parent {
int age;
}
class Child extends Parent {
}
그렇다면 반대는 어떨까? 자손 클래스에 새로운 멤버 play() 메서드를 추가해보자.
class Parent {
int age;
}
class Child extends Parent {
void play() {
System.out.println("오잉?");
}
}
자손 클래스에 새로운 코드가 추가되어도 조상 클래스에는 아무런 영향도 받지 않는다. 여기서 알 수 있듯이, 조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 되지만, 자손 클래스가 변경되는 조상 클래스에 아무런 영향을 주지 못한다.
자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다. 즉, 상속에 상속을 거듭할 수록 상속받는 클래스의 멤버 개수는 점점 늘어나게 된다. 따라서 상속을 받는다는 것은 조상 클래스를 확장한다는 의미로 해석할 수도 있으며 이것이 상속에 사용되는 키워드가 'extends'인 이유이기도 하다.
2) 생성자와 초기화 블럭은 상속 X
자손 클래스는 생성자와 초기화 블럭은 조상 클래스로부터 일절 상속받지 않는다.
3) 접근제어자에 따른 상속 유무?
접근제어자가 default 또는 private인 경우 자손 클래스는 조상 클래스의 멤버를 사용할 수 없다. 상속을 받지 못하여 그런것인가? 아니다. 기본적으로 상속관계 체결되면 무조건 자손 클래스는 조상 클래스의 멤버를 상속받는데 접근 지정자 default, private에 한하여는 그냥 접근이 제한되는 것 뿐이다.
4) 단일 상속
다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 '다중상속'을 허용하지만 자바에서는 오직 단일 상속만을 허용한다.
5) Object 클래스
Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
상속관계에 있어 최초의 조상 클래스는 어떠한 것도 상속받지 않는데, 이 클래스는 컴파일 시 Object 클래스를 상속받게 된다.
읽어주셔서 감사합니다. 😊
Reference
자바의 정석 - 남궁성
'JAVA' 카테고리의 다른 글
JAVA / package와 import (0) | 2020.04.06 |
---|---|
JAVA / 오버라이딩(Overriding) (0) | 2020.04.06 |
JAVA / 변수의 초기화 (0) | 2020.04.03 |
JAVA / 생성자(Constructor) (0) | 2020.04.03 |
JAVA / 오버로딩이란 (0) | 2020.04.03 |