→ 객체 B는 인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진 (재정의된) 메소드를 가지고 있어야 함
public class B implements 인터페이스명 {}
예시 코드
// 인터페이스 선언
public interface RemoteControl {
public void turnOn();
}
public class Television implements RemoteControl{
// 인터페이스에서 선언된 추상메소드 재정의
@Override
public void turnOn(){
System.out.println("TV를 켭니다.");
}
}
public class Audio implements RemoteControl{
@Override
public void turnOn(){
System.out.println("Audio를 켭니다.");
}
}
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc = new Television();
rc.turnOn();
// 출력 : TV를 켭니다.
rc = new Audio();
rc.turnOn();
// 출력 : Audio를 켭니다.
}
}
추상 메소드
: 인터페이스 내 메소드는 모두 추상메소드이다.
만일 구현 클래스에서 (implements) 인터페이스에 선언된 모든 추상 메소드를 재정의하지 않았다면?
당연히 에러 !
[ public abstract ] 리턴타입 메소드명(매개변수);
public interface RemoteControl {
// 상수 필드
// [ public static final ] 이 생략
int MAX_VOLUME = 100;
int MIN_VOLUME = 0;
// 추상 메소드
void turnOn();
void turnOff();
void setVolume(int volume);
}
디폴트(Default) 메소드
: 인터페이스에는 완전한 실행 코드를 가진디폴트 메소드가 선언 가능하다.
→ 인터페이스에서의 추상 메소드는 실행부 {}가 없지만, 디폴트 메소드에는 실행부가 존재
public interface RemoteControl {
// 상수 필드
int MAX_VOLUME = 100;
int MIN_VOLUME = 0;
// 추상 메소드
void turnOn();
void turnOff();
void setVolume(int volume);
// 디폴트 인스턴스 메소드
default void setMute(boolean mute) {
if (mute) {
System.out.println("무음 처리합니다.");
// 추상 메소드 호출하면서 상수 필드 사용
setVolume(MIN_VOLUME);
} else {
System.out.println("무음 해제합니다.");
}
}
}
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc = new Television();
rc.turnOn();
rc.setVolume(5);
rc.setMute(true);
rc.setMute(false);
}
}
//출력값
//TV를 켭니다.
//현재 TV 볼륨: 5
//무음 처리합니다.
//현재 TV 볼륨: 0
//무음 해제합니다.
인터페이스 내 디폴트 메소드의 실행부에는 상수 필드를 읽거나 추상 메소드 호출이 가능하다 !