본문 바로가기

Java/Chapter 15. 클래스 상속 2 : 오버라이딩

[Java] 15.01 - 상속을 위한 두 클래스의 관계

들어가며

 두 클래스를 상속의 관계로 맺는
것이 도움이 되는 상황이 있고

 도움이 되지 않는 상황이 있다.

 그렇다면 언제 두 클래스를 상속의
관계로 맺어야 하는가?

 기본적으로 '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 관계에서는 부각이 되지 않기 때문에, 이를 상속으로 표현하는 경우는 드물다.

참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기