[Java - 상속과 구체화] 2. 상속과 구체화 비교

이현준·2020년 10월 14일
0

Java

목록 보기
7/15

2. 상속과 구체화 비교

2.1 Object 클래스

자바는 어떤 클래스를 정의할 때 그것의 부모 클래스를 나타내지 않으면 해당 클래스는 부모가 없는 클래스가 아니라 Object라는 시스템 라이브러리 java.lang 패키지에 포함되어 있는 클래스를 상속받게 된다. 따라서 자바에 존재하는 모든 클래스(시스템 라이브러리 정의 클래스, 사용자 정의 클래스)는 Object라는 공통된 조상 클래스를 가지게 된다. 따라서 Object o라는 변수에는 자바에 존재하는 모든 객체를 유지할 수 있으며, void f(Object o)는 자바에 존재하는 모든 객체를 인자로 받을 수 있는 메소드가 된다. 이것은 매우 의미 있는 설계이며, 자바의 가장 큰 매력 포인트 중 하나이다.

2.2 상속 vs. 구체화

차이점

상속은 is-a 관계를 모델링하는 것으로 조상에 있는 기능을 후손들이 물려받을 수 있도록 하여 코드 중복을 줄여준다. 하지만 구체화는 이와 같은 코드 중복을 줄여주는 기능은 없다. 자바 8부터는 interface에 메소드를 정의할 수 있지만 멤버 변수를 정의할 수는 없기 때문에 상속과 달리 코드 중복을 줄이는 것이 어렵다. 특히, 메소드를 정의할 수 있도록 한 것은 코드 공유보다는 함수형 프로그래밍을 도입하면서 기존 시스템 라이브러리에 큰 변화가 필요하였는데, 이것의 부작용을 최소화하기 위해 불가피하게 도입한 요소이다. 또 interface가 상태를 가지게 되면
클래스와 차이가 없어진다.

동일한 장점

구체화는 클래스를 정의하면서 코드를 재사용할 수 있도록 해주는 기능은 약하지만 상속과 마찬가지로 그룹핑되어 있는 객체을 공통으로 처리할 수 있는 리모컨이 만들어진다는 측면에서 동일한 장점을 가지고 있다. 상속 관계에서 상위 클래스인 Pet이 있을 때 void f(Pet p)나 구체화 관계에서 Flyable interface가 있을 때 void g(Flyable f)는 둘 다 다양한 타입의 객체를 받아 처리할 수 있는 범용 메소드가 된다.

자바 8이후의 interface 사용시 주의점

자바에서는 C++의 다중 상속의 문제 때문에 하나의 부모로부터만 상속받을 수 있도록 하였다. 반면에 한 클래스는 여러 개의 interface를 구체화할 수 있다. 자바 8 이전에 interface는 메소드를 선언만 할 수 있었기 때문에 interface를 여러 개 구체화함에 따른 부작용이 없었다. 하지만 자바 8부터는 메소드를 정의할 수 있기 때문에 C++의 다중 상속에 존재하는 문제점이 자바에도 나타날 수 있게 되었다. 따라서 응용을 개발하는 프로그래머 입장에서는 interface에 메소드를 정의할 경우에는 그것이 꼭 필요한 것인지 검토해야 한다

2.3 default 메소드

기본 메소드는 앞서 설명한 바와 같이 자바 8에서 함수형 프로그래밍을 도입하면서 불가피하게 도입한 문법 요소이다. 그 이유는 다음과 같다. 보통 한 클래스를 상속한 클래스의 수는 많지 않다. 반대로 한 interface를 구체화한 클래스는 매우 많을 수 있다. 자바 시스템 라이브러리에 있는 Comparable interface의 경우에는 자바에 존재하는 모든 클래스가 다 구체화하고 있다고 보아도 과장이 아니다. 어떤 interface I에 f() 메소드가 선언되어 있다고 하고, 이 interface를 n개의 클래스가 구체화하고 있다고 가정하자. 그 이후에 interface I에 g() 메소드를 추가할 필요성이 생겼다고 하자. 그러면 n개의 클래스에 g()를 모두 재정의하지 않으면 n개 클래스를 사용하는 모든 프로그램은 다시 컴파일할 경우 오류가 생긴다. 이때 g()를 선언만 하지 않고 g() 메소드를 빈 메소드로 정의할 수만 있다면 n개의 클래스는 다시 컴파일하더라도 오류가 발생하지는 않는다.

0개의 댓글