interface 인터페이스이름 { //상수 타입 상수명 = 값; //추상메소드 타입 메소드명(); }
interface RemoteControl {
//상수
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
//추상메소드
void turnOn();
void turnOff();
}
public static final
이 생략되어있음. 예) int MAX_VOLUME = 10;public abstract
가 생략되어있음.✅ 개발 코드가 직접 객체의 메소드를 호출하면 간단한데 중간에 왜 인터페이스를 둘까?
코드를 수정하지 않고 사용하는 구현 객체를 손쉽고 빠르게 변경할 수 있기 때문이다.
코드 변경없이 구현 객체를 교체하면서 프로그램의 실행 결과와 리턴값이 다양해진다 -> 다형성
인터페이스에 정의된 메소드들을 실제로 구현한다.
public class 구현클래스이름 implements 인터페이스 { // 인터페이스에 선언된 추상 메소드의 실체 메소드 }
public class Television implements RemoteControl {
private int volume;
@Override
public void turnOn{
System.out.println("TV를 켭니다.");
}
@Override
public void turnOff
System.out.println("TV를 끕니다.");
}
}
public class Audio implements RemoteControl {
private int volume;
@Override
public void turnOn{
System.out.println("Audio를 켭니다.");
}
@Override
public void turnOff
System.out.println("Audio를 끕니다.");
}
}
public class MyClass {
// 필드
RemoteControl rc = new Television();
// 생성자
MyClass() {
}
MyClass(RemoteControl rc) {
this.rc = rc;
rc.turnOn();
}
// 메소드
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn();
}
}
public class MyClassEx {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
myClass1.rc.turnOn(); // TV를 켭니다.
MyClass myClass2 = new MyClass(new Audio()); // Audio를 켭니다.
MyClass myClass3 = new MyClass();
myClass3.methodA(); // Audio를 켭니다.
}
}
클래스는 이미 구현된 메소드가 있을 수 있기 때문에 다중 상속이 불가능하지만,
인터페이스는 선언만 할 뿐 구현된 메소드가 없기 때문에 오버라이딩해서 쓰면 돼서 메소드를 얼마든 상속 받아도 아무런 문제가 발생하지 않는다.