[Java] 7. 상속(Inheritance, IS-A) 예제


포함관계 예제로 TV에 대한 예제 코드 포스팅이다.


상속 포스팅

이전 포함관계 포스팅[]


1. 스마트TV 클래스 포함관계 예제

인터넷TV 출시에 이어 스마트TV까지 출시되면서 SmartFeature 클래스에 새로운 기능들이 추가되었다. 지속적인 상속관계로는 관리하기가 힘들어지기 때문에 스마트TV에서는 SmartFeature 기능을 포함관계로 구현하였다.

SmartTV 클래스는 InternetTV 는 상속관계로 SmartFeature는 포함관계로 클래스를 만들었다.


추가로 채널, 소리 버튼 기능(메서드)를 통해서 오버라이딩을 이용한 upChannel, downChannel 메서드를 이용한 것을 볼 수 있다. 오버라이딩에 대해서는 해당[] 포스팅에서 설명하겠다.

@Override
public void upChannel() {
    if ("스마트채널".equals(featureStatus)) {
        super.upChannel();
    } else {
        this.moveYCursor(1);
    }
}

@Override
public void downChannel() {
    if ("스마트채널".equals(featureStatus)) {
        super.downChannel();
    } else {
        this.moveYCursor(-1);
    }
}

/**
 * 스마트 TV 기능
 */
class SmartFeature {
    
    //OTT 기능
    public void onOTT(){
        //기능 구현
        System.out.println("OTT 메뉴 실행");
    }
    //유뷰트 기능
    public void onYoutube() {
        //기능 구현
        System.out.println("유튜브 메뉴 실행");
    }
    //블루투스 기능
    public void onBluetooth() {
        //기능 구현
        System.out.println("블루투스 연결");
    }
    //USB 기능
    public void onUsb(){
        //기능 구현
        System.out.println("USB 연결");
    }
}

/**
 * 스마트 TV
 * 인터넷 TV 상속관계
 * 스마트기능 포함관계
 */
class SmartTV extends InternetTV {//상속

    //포함관계 예시
    SmartFeature smartFeature;

    SmartTV() {
        smartFeature = new SmartFeature();
    };
    //포함
    void onClinkYoutube() {
        onSmart();
        smartFeature.onYoutube();
    }
    void onClinkBluetooth() {
        onSmart();
        smartFeature.onBluetooth();
    }
    void onClinkUsb() {
        onSmart();
        smartFeature.onUsb();
    }
    //상속
    //스마트TV에 스마트기능 사용시에 스마트채널 기능
    void onSmart() {
        featureStatus = "스마트채널";
    }

    //오버라이드 예시
    public void moveYCursor(int y) {
        //포인트 Cursor 위치 상하 이동 기능
    }

    public void moveXCursor(int x) {
        //포인트 Cursor 위치 좌우 이동 기능
    }

    @Override
    public void upChannel() {
        if ("스마트채널".equals(featureStatus)) {
            super.upChannel();
        } else {
            this.moveYCursor(1);
        }
    }

    @Override
    public void downChannel() {
        if ("스마트채널".equals(featureStatus)) {
            super.downChannel();
        } else {
            this.moveYCursor(-1);
        }
    }

    @Override
    public void upVolume() {
        if ("스마트채널".equals(featureStatus)) {
            super.upVolume();
        } else {
            this.moveXCursor(1);
        }
    }

    @Override
    public void downVolume() {
        if ("스마트채널".equals(featureStatus)) {
            super.downVolume();
        } else {
            this.moveXCursor(-1);
        }
    }
}

/**
 * 스마트TV 리모컨 기능
 */
public class ExSmartTV4Remote {

    public static void main(String... args) {

        String action = args[0];
        String channelNum = (args.length > 1) ? args[1] : "0";

        System.out.println("버튼 클릭: " + args[0]);

        //InternetTV tv = new InternetTV();
        SmartTV tv = new SmartTV();

        switch (action) {
            case "UP_BTN":
                tv.upChannel();
                break;

            case "DOWN_BTN":
                tv.downChannel();
                break;

            case "LEFT_BTN":
                tv.downVolume();
                break;

            case "RIGHT_BTN":
                tv.upVolume();
                break;

            case "SET_CHANNEL":
                tv.setChannel( Integer.valueOf(channelNum) );
                break;

            case "PAID_BTN"://유료채널 버튼
                tv.movePaidChannel();
                break;

            case "INET_ON"://인터넷채널 버튼
                tv.onInternetChannel();
                break;

            case "ON_YOUTUBE"://유튜브 클릭
                tv.onClinkYoutube();
                break;

            case "ON_BLUETOOTH"://블루투스 클릭
                tv.onClinkBluetooth();
                break;

            case "ON_USB"://USB 클릭
                tv.onClinkUsb();
                break;

            case "EXIT_BTN"://기본 TV 채널로 나가기 버튼
                tv.moveDefaultChannel();
                break;
        }

        System.out.println("채널 번호: " + tv.channel);
        System.out.println("기능 상태: " + tv.featureStatus);

    }
}