상속
1. 상속의 정의
상속은 말그대로 자식이 부모로부터 무언가를 물려받는 것을 의미합니다. 자바에서의 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것입니다. 상속을 활용하면 코드의 재사용성을 높이고 중복을 제거하여 생산성 향상과 보다 용이한 유지보수가 가능해집니다.
클래스의 상속을 위해서는 클래스 선언부에 extends 키워드를 사용합니다.
자식클래스 extends 부모클래스
다음 예제 코드를 통해 상속에 대해 자세하게 알아보겠습니다.
public class JavaApp { class ParentClass { String parent = "I'm parent."; public void parentMethod() { System.out.println("Parent Class - parentMethod()"); } } class ChildClass extends ParentClass { String child1 = "I'm child1."; String child2 = "I'm child2."; public void childMethod() { parentMethod(); // 부모클래스의 parentMethod 호출 System.out.println(parent); // 부모클래스의 parent 변수 출력 System.out.println("Child Class - childMethod()"); System.out.println(child1); System.out.println(child2); } } public static void main(String[] args) { JavaApp javaApp = new JavaApp(); ChildClass childClass = javaApp.new ChildClass(); childClass.childMethod(); } }
위의 예제 실행시 다음의 결과가 출력됩니다.
Parent Class - parentMethod()
I'm parent. Child Class - childMethod()
I'm child1.
I'm child2.
여기서 상속의 특징에 대해서 정리해보도록 하겠습니다.
- 기존의 클래스를 재사용하여 새로운 클래스를 작성한다.
- 두개 이상의 클래스를 부모와 자식으로 관계를 맺어준다.
- 자식 클래스는 부모 클래스의 모든 멤버를 상속받는다. (생성자, 초기화블럭 제외)
- 다중 상속이 불가능하다.
- 자식 클래스의 멤버 개수는 부모 클래스와 같거나 많다.
- 부모 클래스가 변경되면 자식 클래스는 영향을 받지만, 자식 클래스가 변경되는 것은 부모 클래스에 영향을 주지 않는다.
- 상속받은 자식 클래스의 인스턴스 생성시 부모 클래스의 멤버도 함께 생성된다.
※ 부모 클래스의 멤버(변수,메서드)가 private 접근 제한자를 가지는 경우
- 멤버 변수는 상속되지만 바로 접근할 수 없다.
- 메서드는 상속되지 않는다.
2. 클래스간의 관계 - is a, has a
지금까지 알아본 상속 이외에도 클래스를 재사용하는 또다른 방법이 있습니다. 포함(composite) 관계를 통하여 클래스를 재사용하는 방법인데 한 클래스의 멤버 변수로 다른 클래스를 포함시키는 것을 뜻합니다.
자바에서는 프로그램에 사용되는 모든 클래스들을 분석하여 가능한 많은 관계를 맺어 코드의 재사용성을 높여주는 것이 좋습니다.
상속과 포함을 통해 각각의 클래스간의 관계가 갖는 차이점을 알아보겠습니다.
상속 관계(inheritance - is a)
- 관계를 문장으로 만들어봤을 때 '~은 이다.' 라는 문장이 성립한다.
- 상속의 특징을 따른다.
포함 관계(composite - has a)
- 관계를 문장으로 만들어봤을 때 '~은 ~을 가지고 있다.' 라는 문장이 성립한다.
- 한 클래스의 멤버변수로 다른 클래스를 선언하여 사용한다.
- 작은 단위의 클래스를 먼저 만들고, 이것들을 포함하여 하나의 커다란 클래스를 만든다.
다음 예제 코드를 통해 포함 관계에 대해 확인해보겠습니다.
class Car { Engine engine = new Engine(); Door door = new Door(); Sheet sheet = Sheet(); Wheel wheel = Wheel(); }
3. 단일 상속
자바에서는 단일 상속만을 허용하기 때문에 여러 개의 클래스로부터 상속을 받을 수 없습니다.
먼저 다중상속의 장점과 단점에 대해 알아보겠습니다.
장점 :
- 여러 클래스로부터 상속을 받아 복합적인 클래스를 쉽게 작성이 가능하다.
단점 :
- 클래스 간의 관계가 복잡해진다.
- 서로 다른 클래스로부터 상속받은 멤버들간의 이름이 같은 경우 구별할 수 있는 방법이 없다.
이러한 특징으로 인하여 자바에서는 다중 상속 허용하지 않고 단일 상속만을 허용합니다. 대신 추후에 설명할 인터페이스라는 기능을 통해 보완된 형태의 다중상속을 구현할 수 있도록 지원하고 있습니다.
단일 상속이 하나의 부모클래스만을 갖기 때문에 다중 상속에 비해 불편한 점도 있지만, 클래스 간의 관계가 명확해지고 신뢰성 있는 코드를 만들어준다는 장점을 가지고 있습니다.
마지막으로 단일 상속을 고려한 코드 작성시 비중이 가장 높은 클래스 하나를 부모 클래스로 하고 나머지는 포함 관계로 설정하는 것도 좋은 방법입니다.
4. Object 클래스
Object 클래스는 모든 클래스의 상속 계층도의 최상위에 위치하는 클래스입니다. 상속을 받지 않는 클래스들은 모두 자동적으로 Object 클래스로부터 상속을 받게 되어 있습니다. 특징은 다음과 같습니다.
- 모든 클래스의 상속 계층도의 최상위에 위치하는 클래스
- 다른 클래스를 상속 받지 않는 모든 클래스들은 자동으로 Object 클래스를 상속받는다. (컴파일시 컴파일러가 추가한다.)
- toString(), equals() 와 같은 모든 인스턴스가 가져야 할 기본적인 11개의 메서드가 정의되어 있다.
이상으로 자바의 상속에 대해서 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 2nd Edition』, 도우출판(2010)
wikidocs, 자바 상속, https://wikidocs.net/280
tistory, 자바 상속, http://blog.eairship.kr/116
tistory, 자바 상속, http://gangzzang.tistory.com/entry/Java-상속inheritance