본문 바로가기

Programming/JAVA

인터페이스(7) - 인터페이스의 구현과 사용 1 : 추상 메서드 사용

java logo image

 

 

 

지금까지 인터페이스와 관련해 여러 가지 원리와 기본 규칙들에 대해서 알아보았습니다. 본격적으로 인터페이스에서 선언한 내용을 구현하고, 실제 실행 코드에서 사용하는 방식에 대해서 살펴보도록 하겠습니다. 우선, 기본적인 내용을 다시 한번 되짚어 보도록 하겠습니다. 

 

인터페이스를 사용하기 위해서는, 우선 인터페이스 타입의 변수를 선언하고 여기에 구현 클래스의 인스턴스를 대입합니다(만일 익명 객체 형태로 구현한다면 인터페이스 타입). 당연하지만 인터페이스 타입의 변수도 참조 타입이므로 구현 클래스 인스턴스의 메모리 주소를 참조하게 됩니다. 

 

RemoteControl rc = new Television();

RemoteControl rc2;
rc2 = new Audio();

 

참고로 인터페이스는 사용 범위에 있어서 클래스의 필드 / 생성자나 메서드의 파라미터 / 생성자나 메서드의 로컬 변수로서 선언될 수 있습니다. 사실상 특별한 경우를 제외한다면 사용에 크게 제한이 없다는 의미와도 비슷합니다. 

 

public class ExampleClass {
    // 필드
    RemoteControl rc = new Television();
    
    // 생성자
    ExampleClass(RemoteControl rc) {
        this.rc = rc;
    }
    
    // 메서드
    void methodEx() {
        // 로컬변수
        RemoteControl rc = new Audio();
    }
    
    void methodEx2(RemoteControl rc) { ... }
}

 

 

 


 

 

○ 인터페이스의 추상 메서드 사용

 

앞서 추상 메서드 개념을 학습하면서 충분히 이해 했을 것으로 생각하지만, 다시 한번 짚고 넘어가겠습니다. 인터페이스에서 선언된 추상 메서드의 경우, 구현 클래스에서 오버라이드해 구현하게 됩니다. 그리고, 실행 클래스에서 인터페이스 타입 변수가 참조하는 구현 클래스의 종류에 따라 해당 메서드 실행 시 재정의된 메서드의 실행 코드가 호출됩니다. 

 

인터페이스는 중개자 역할을 한다고 했습니다. 여기서 RemoteControl이라는 중개자가 구현 클래스가 Television인지 Audio인지 여부에 따라 각각의 동작을 호출하게 되는 것입니다. 같은 메서드라도 TV 또는 오디오에 맞는 실행 코드가 동작하는 것이죠. 

 

public interface RemoteControl {
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
    
    default void setMute(boolean mute) {
        if(mute) {
            System.out.println("무음");
        } else {
            System.out.println("무음 해제");
        }
    }
    
    static void changeBattery() {
        System.out.println("배터리 교환");
    }
}

 

public class Television implements RemoteControl{
	
	// 필드
	private int volume;
	
	// turnOn() 추상 메서드의 실체 메서드
	public void turnOn() {
		System.out.println("TV를 켭니다.");
	}
	
	// turnOff() 추상 메서드의 실체 메서드
	public void turnOff() {
		System.out.println("TV를 끕니다.");
	}
	
	// setVolume() 추상 메서드의 실체 메서드
	public void setVolume(int volume) {
		if(volume > RemoteControl.MAX_VOLUME) {
			this.volume = RemoteControl.MAX_VOLUME;
		} else if(volume < RemoteControl.MIN_VOLUME) {
			this.volume = RemoteControl.MIN_VOLUME;
		} else {
			this.volume = volume;
		}
		
		System.out.println("현재 TV 볼륨: " + volume);
	}
}

 

public class Audio implements RemoteControl {
	// 필드
	private int volume;
	
	// turnOn() 추상 메서드의 실체 메서드
	public void turnOn() {
		System.out.println("스피커를 켭니다.");
	}
	
	// turnOff() 추상 메서드의 실체 메서드
	public void turnOff() {
		System.out.println("스피커를 끕니다.");
	}
	
	// setVolume() 추상 메서드의 실체 메서드
	public void setVolume(int volume) {
		if(volume > RemoteControl.MAX_VOLUME) {
			this.volume = RemoteControl.MAX_VOLUME;
		} else if(volume < RemoteControl.MIN_VOLUME) {
			this.volume = RemoteControl.MIN_VOLUME;
		} else {
			this.volume = volume;
		}
		
		System.out.println("현재 스피커 볼륨: " + volume);
	}
}

 

public class ExampleMain {	
	public static void main(String[] args) {
		RemoteControl rc = null;
		
		rc = new Television();
		rc.turnOn();
		rc.turnOff();
		
		rc = new Audio();
		rc.turnOn();
		rc.turnOff();
	}
}

/* 출력
TV를 켭니다.
TV를 끕니다.
스피커를 켭니다.
스피커를 끕니다.
*/