인터페이스는 필드, 매개변수, 로컬 변수의 타입으로 선언 가능하다.
// 인터페이스
public interface RemoteControl {
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
// RemoteControl을 구현하는 Television 클래스
public class Television implements RemoteControl {
private int volume;
public void turnOn() {
System.out.println("TV를 켭니다");
}
public void turnOff() {
System.out.println("TV를 끕니다");
}
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 볼륨: " + this.volume);
}
}
public class Audio implements RemoteControl {
private int volume;
public void turnOn() {
System.out.println("Audio를 켭니다");
}
public void turnOff() {
System.out.println("Audio를 끕니다");
}
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("현재 Audio 볼륨: " + this.volume);
}
}
public class MyClass {
// 필드로 사용
RemoteControl rc = new Television();
MyClass() {
}
// 생성자의 매개변수로 사용
MyClass(RemoteControl rc) {
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
void methodA() {
// 메소드의 로컬변수로 사용
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume(3);
}
// 메소드의 매개변수로 사용
void methodB(RemoteControl rc) {
rc.turnOn();
rc.setVolume(7);
}
}
인터페이스가 필드 타입으로 사용될 경우, 필드에 구현 객체를 대입할 수 있다.
인터페이스가 생성자의 매개 변수 타입으로 사용될 경우, new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있다.
인터페이스가 로컬 변수 타입으로 사용될 경우, 변수에 구현 객체를 대입할 수 있다.
인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현 객체를 매개값으로 대입할 수 있습니다.
public class MyClassExample {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
myClass1.rc.turnOn();
myClass1.rc.setVolume(1);
MyClass myClass2 = new MyClass(new Audio());
MyClass myClass3 = new MyClass();
myClass3.methodA();
MyClass myClass4 = new MyClass();
myClass4.methodB(new Television());
}
}
/* 실행결과
MyClass1
TV를 켭니다
현재 TV 볼륨: 1
MyClass2
Audio를 켭니다
현재 Audio 볼륨: 5
MyClass3
Audio를 켭니다
현재 Audio 볼륨: 3
MyClass4
TV를 켭니다
현재 TV 볼륨: 7
*/