지금까지 인터페이스와 관련된 다양한 원칙과 기본 규칙에 대해 배웠습니다. 인터페이스에 선언된 내용이 실제 실행 코드에서 어떻게 구현되고 사용되는지 자세히 살펴보자. 먼저 기본부터 다시 살펴보겠습니다.
인터페이스를 사용하려면 먼저 인터페이스 유형의 변수를 선언하고 구현 클래스(익명 개체로 구현될 때 인터페이스 유형)의 인스턴스를 할당합니다. 분명히 인터페이스 유형 변수도 참조 유형이므로 구현 클래스 인스턴스의 메모리 주소를 참조합니다.
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) { ... }
}
1. 추상 인터페이스 메서드 사용
이전에 추상 메서드 개념을 완전히 이해했다고 확신하지만 다시 살펴보겠습니다. 인터페이스에서 선언된 추상 메서드는 구현 클래스에서 재정의하여 구현됩니다. 그리고 실행 클래스의 인터페이스 유형 변수가 참조하는 구현 클래스의 유형에 따라 재정의된 메서드의 실행 코드는 메서드가 실행될 때 호출됩니다.
인터페이스는 중개자 역할을 하도록 되어 있습니다. 여기서 RemoteControl이라는 중개자는 구현 클래스가 텔레비전인지 오디오인지에 따라 각 작업을 호출합니다. 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 setMuete(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를 끕니다.
스피커를 켭니다.
스피커를 끕니다.
*/