들어가며
두 클래스를 상속의 관계로 맺는
것이 도움이 되는 상황이 있고
도움이 되지 않는 상황이 있다.
그렇다면 언제 두 클래스를 상속의
관계로 맺어야 하는가?
기본적으로 'IS-A 관계'라는 것이
성립해야
상속의 후보로 고려할 수 있다.
상속의 기본 조건인 'IS-A 관계'
상속이 갖는 문법적 특성을
통해서
상위 클래스와 하위 클래스를
다음과 같이 이야기 할 수 있다.
"하위 클래스는 상위 클래스의 모든 특성을 지닌다."
"거기에 더하여 하위클래스는 자신만의 추가적인 특성을 더하게 된다."
이러한 '상속'의 특성을 현실
세계에서도 찾아볼 수 있다.
대표적인 예가 다음과 같다.
아래에서 모바일폰은 통화의 기능만 담겨있는 feature phone을 의미한다.
모바일폰 vs 스마트폰
'모바일폰'이 상위 클래스라면
'스마트폰'은 하위 클래스이다.
즉, 이 둘을 객체지향의 관점에서
보면 다음과 같이 이야기 할 수 있다.
"모바일폰을 스마트폰이 상속한다."
스마트폰은 모바일폰이 갖는
특성을 모두 갖는다.
게다가 스마트폰은 앱의 설치 및
실행 등
컴퓨터의 특성을 추가적으로
갖고 있다.
따라서 클래스를 설계한다면
다음과 같은 설계가 논리적으로
타당하다.
class 스마트폰 extends 모바일폰 {....}
그런데 우리는 '스마트폰도
모바일 폰의 한 종류'라 말한다.
즉 컴퓨터의 기능이 추가된
모바일폰이 스마트폰인 것이다.
따라서 다음과 같이 이야기
할 수 있다.
"스마트폰도 모바일폰이다."
"스마트폰은 일종의 모바일폰이다."
그리고 위의 문장들이 나타내는
관계를 가리켜 'IS-A 관계'라 하고,
이것이 상속의 관계를 맺기 위한
두 클래스의 기본 조건이 된다.
참고로 'IS-A 관계'의 어원은 '~ is a ~.'(~은 ~이다.)에서 유래되었다.
예를 들면 다음과 같다.
Life is a journey. // 인생은 여행이다.
지금까지 설명한 내용을 정리하면
다음과 같다.
- IS-A 관계는 '~은 ~이다.'로 표현될 수 있는 관계이다.
ex) 노트북은 컴퓨터이다. 전기자동차는 자동차이다. - 상속이 갖는 문법적 특성은 IS-A 관계의 표현에 적합하다.
- 따라서 상속 관계를 형성하기 위한 두 클래스는 IS-A 관계에 있어야 한다.
그럼 지금까지 언급한 모바일폰과
스마트폰의 관계를
코드로 표현해 보겠다.
class MobilePhone {
protected String number; // 전화번호
public MobilePhone(String num) {
number = num;
}
public void answer() {
System.out.println("number: " + number);
}
}
class SmartPhone extends MobilePhone {
private String androidVer;
public SmartPhone(String num, String ver) {
super(num);
androidVer = ver;
}
public void playApp() {
System.out.println("App is running in " + androidVer);
}
}
class MobileSmartPhone {
public static void main(String[] args) {
SmartPhone phone = new SmartPhone("010-3333-6666", "Nougat");
phone.answer(); // 전화를 받는다.
phone.playApp(); // 앱을 선택하고 실행한다.
}
}
/* 출력 결과
number: 010-3333-6666
App is running in Nougat
*/
스마트폰은 모바일폰이 갖는
기능을 모두 갖는다.
그리고 실제로 스마트폰은
모바일폰의 일종이다.
따라서 모바일폰은 상위 클래스로,
스마트폰은 이를 상속하는
하위 클래스로 설계하는 것은
매우 적절하고 합리적인 선택이다.
참고 - 상속과 HAS-A 관계
소유의 관계를 의미하는 'HAS-A' 관계라는 것도 상속으로 표현할 수 있는 관계로 언급이 된다.
(순수하게 학문적으로 접근할 때 그렇게 언급되는 경향이 있다.)
그러나 실무 개발에 있어서 HAS-A 관계를 상속으로 표현하는 경우는 보기 어렵다.
상속이 갖는 커다란 장점이 HAS-A 관계에서는 부각이 되지 않기 때문에, 이를 상속으로 표현하는 경우는 드물다.
참고 및 출처
|