인터페이스 실습 - Remote

리모컨 하나로 TV, 전등, 자동차를 모두 켜고 꺼보자.

  • RemoteControl : 인터페이스

    • turnOn(), turnOff(), set_vol(int vol) : 추상 메서드

    • get_vol(, set_MUTE() : default 메서드

      • 디폴트 메소드는 인터페이스에 선언되지만 사실 객체가 가지고 있는 인스턴스 메소드라고 생각해야한다.

      • {}까지 있다고 생각하면된다.

package remote;

public interface RemoteControl {
	public static int MAX_VOL = 10;
    public static int MIN_VOL = 0;

    public void turnOn();

    public void turnOff();

    public void set_vol(int vol);
    
    public default int get_vol(){
		return 0;
	}
   
    public default void set_MUTE(){
    	
    	System.out.println("");
    	
    }

}
  • TV : RemoteControl과 Realization(인터페이스와 구현의 관계)하고 있다.

package remote;
public class TV implements RemoteControl {

	private int volume;
	@Override	
	public void turnOn() {
		// TODO Auto-generated method stub
		System.out.println("TV를 켭니다.");
	}

	@Override
	public void turnOff() {
		// TODO Auto-generated method stub
		System.out.println("TV를 끕니다.");
	}

	@Override
	public void set_MUTE() {
		// TODO Auto-generated method stub
		
		System.out.println("TV 음소거를 합니다.");
	}

	@Override
	public void set_vol(int vol) {
		// TODO Auto-generated method stub
		this.volume = vol;
	}
    
	@Override
	public int get_vol() {
		// TODO Auto-generated method stub
		return this.volume;
	}
}
  • Car : RemoteControl과 Realization(인터페이스와 구현의 관계)하고 있다.

package remote;

public class Car implements RemoteControl {

	@Override
	public void turnOn() {
		// TODO Auto-generated method stub
		System.out.println("시동을 켭니다.");
	}

	@Override
	public void turnOff() {
		// TODO Auto-generated method stub
		System.out.println("시동을 끕니다.");
	}

	@Override
	public void set_vol(int vol) {
		// TODO Auto-generated method stub
	}
}
  • Audio : RemoteControl과 Realization(인터페이스와 구현의 관계)하고 있다.

package remote;

public class Audio implements RemoteControl {

	private int volume;
	@Override	
	public void turnOn() {
		// TODO Auto-generated method stub
		System.out.println("AUDIO를 켭니다.");
	}

	@Override
	public void turnOff() {
		// TODO Auto-generated method stub
		System.out.println("AUDIO를 끕니다.");
	}

	@Override
	public void set_vol(int vol) {
		// TODO Auto-generated method stub
		this.volume = vol;
	}
	
    @Override
	public int get_vol() {
		// TODO Auto-generated method stub
		return this.volume;
	}
}
  • RemoteRole : 모든 변수들을 리모컨 하나로 제어

package remote;

public class RemoteRole implements RemoteControl {

	RemoteControl rc = null;
	
	public RemoteRole(TV tv){
		this.rc = tv;
	}
	
	public RemoteRole(Audio au){
		this.rc=au;		
	}
	public RemoteRole(RemoteControl rc){
		this.rc= rc;		
	}
	
	public void changeMode(Object o){
		
		if(o instanceof Audio){
			System.out.println("Audio Mode·");
			this.rc = (Audio) o;
		}
		else if (o instanceof TV){ 
			System.out.println("TV Mode");
			this.rc = (TV) o;
		}		
		else System.out.println("자동차 Mode");
	}
	
	public void changeMode(Audio au){
		System.out.println("Audio Mode로 변경합니다.");
		this.rc = au;
	} 
	
	public void changeMode(TV tv){
		
		System.out.println("TV Mode로 변경합니다.");
		this.rc = tv;
	} 
	
	public void changeMode(Car car){
		
		System.out.println("Car Mode로 변경합니다.");
		this.rc = car;
	} 

	@Override
	public void turnOn() {
		// TODO Auto-generated method stub
		this.rc.turnOn();
	}

	@Override
	public void turnOff() {
		// TODO Auto-generated method stub
		this.rc.turnOff();
	}

	@Override
	public void set_vol(int vol) {
		// TODO Auto-generated method stub
		this.rc.set_vol(vol);
	}
    
    @Override
	public int get_vol() {
		// TODO Auto-generated method stub
		return this.rc.get_vol();
	}	
}
  • Main()

    • RemoteRole이 RemoteControl을 implements하지 않았기 때문에 my_rc.rc.get_vol()로 접근할 수 있다.

    • 그래서 불편함을 없애기 위해서 RemoteRole이 rc를 갖고 있으면서 RemoteControl을 구현하도록 했다.

package remote;

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RemoteControl mr; 
		TV tv = 	new TV();
		Audio au = new Audio();
		Car  car = new Car();
		
		mr = tv; 
		mr.turnOn();
		mr.set_MUTE();
		mr.set_vol(3);
		System.out.println("---------------------------------");
	
		mr = au;
		mr.turnOn();
		mr.set_vol(5);
		mr.set_MUTE();		
		System.out.println(mr.get_vol());
		System.out.println("---------------------------------");
		
		
		RemoteRole my_rc = new RemoteRole(tv);
		
		//System.out.println(" tv  sound : " + my_rc.rc.get_vol()); 
		System.out.println("tv sound : " + my_rc.get_vol());
		
		System.out.println("---------------------------------");
		my_rc.changeMode(tv);
		my_rc.set_vol(9);
		System.out.println("tv sound : " + my_rc.get_vol());
		
		my_rc.changeMode(au);
		System.out.println("audio sound : " + my_rc.get_vol());
		
		my_rc.changeMode((Object) tv);
		my_rc.changeMode(car);
		my_rc.turnOn();

	}

}
  • output

TV를 켭니다.
TV 음소거를 합니다.
---------------------------------
AUDIO를 켭니다.
5
---------------------------------
tv sound : 3
---------------------------------
TV Mode를 변경합니다.
tv sound : 9
Audio Mode를 변경합니다.
audio sound : 5
TV Mode
Car Mode를 변경합니다.
시동을 켭니다.

Last updated