상속(inheritance)

상속의 정의와 장점

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.

이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

상속을 구현하는 방법

class Child extends Parent{
}

위의 왼쪽과 같은 클래스 간의 상속관계 그림을 **상속계층도(class hierarchy)**라고 한다.

자식 클래스는 부모 클래스의 모든 멤버를 상속받기 때문에, Child클래스는 Parent클래스의 멤버들을 포함한다고 할 수 있다.

만일 Parent 클래스에 age라는 정수형변수를 멤버변수로 추가하면, 자손 클래스는 조상의 멤버들을 모두 상속받기 때문에, Child클래스는 자동적으로 age라는 멤버변수가 추가된것과 같은 효과를 얻는다.

class Parent{
		int age;
}

class Child extends Parent{
		void play(){
				System.out.println("play!");
		}
}

Child클래스에 새로운 코드가 추가되어도 Parent클래스는 아무런 영향도 받지 않는다.

부모클래스가 변경되면 자식클래스는 자동적으로 영향을 받게되지만, 자식클래스가 변경되는것은 부모클래스에 아무런 영향을 끼치지 않는다.

상속의 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어나게 된다. 그래서 상속을 받는 다는 것이 부모클래스를 확장(extend)한다는 의미도 있다. 그래서 상속에 사용되는 키워드가 extends이다.

<aside> 💡 - 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.

</aside>

** 접근제어자(access modifier)가 private또는 default인 멤버들은 상속되지 않는다기보다 상속은 받지만 자식클래스로부터 접근이 제한되는 것이다. **