※ 객체 생성 필요
디폴트 메소드는 인터페이스에 선언되지만, 인터페이스에서 바로 사용할 수 없다.추상 메소드가 아닌 인스턴스 메소드이므로 구현 객체가 있어야 사용할 수 있다.
디폴트 메소드는 모든 구현 객체가 가지고 있는 기본 메소드이다.
구현 클래스를 작성할 때 디폴트 메소드를 오버라이딩해서 자신에게 맞게 수정하면 디폴트 메소드가 호출될 때 자신을 재정의한 메소드가 호출된다.
인터페이스
package sec04.exam02_default_method_use;
public interface RemoteControl {
//상수 필드
public static final int MAX_VOLUME = 10;
int MIN_VOLUME = 0; //public static final 생략 가능 -> 컴파일 과정에서 자동으로 붙음
//추상 메소드 - 선언부만 작성하고 실행내용은 작성x
public abstract void turnOn();
void turnOff(); //public abstract 생략 가능 -> 컴파일 과정에서 자동으로 붙음
void setVolume(int volume);
//디폴트 메소드 - java 8 버전 부터 - 실행내용 작성O - default 키워드 꼭 작성해야함!
public default void setMute(boolean mute) { //public 생략 가능 -> 컴파일 과정에서 자동으로 붙음
if(mute) {
System.out.println("무음 처리합니다.");
} else {
System.out.println("무음 해제합니다.");
}
}
//정적 메소드 - java 8 버전 부터 - 실행내용 작성O - static 키워드 꼭 작성해야함!
public static void changeBattery() {
System.out.println("건전지를 교환합니다."); //public 생략 가능 -> 컴파일 과정에서 자동으로 붙음
}
}
구현 클래스1
package sec04.exam02_default_method_use;
public class Television implements RemoteControl { //만약 추상메소드의 실체 메소드를 선언하지 않거나, 일부만 선언하는 경우 abstract class 가 되어야한다.
//필드
private int volume;
@Override //turnOn() 추상 메소드의 실체 메소드
public void turnOn() {
System.out.println("TV를 켭니다.");
}
@Override //turnOff() 추상 메소드의 실체 메소드
public void turnOff() {
System.out.println("TV를 끕니다.");
}
@Override //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 { //volume이 MIN과 MAX 사이라면 (정상값)
this.volume = volume;
}
System.out.println("현재 TV 볼륨: " + volume);
}
}
구현 클래스2 (디폴트 메소드 오버라이딩)
package sec04.exam02_default_method_use;
public class Audio implements RemoteControl { //만약 추상메소드의 실체 메소드를 선언하지 않거나, 일부만 선언하는 경우 abstract class 가 되어야한다.
//필드
private int volume;
private boolean mute; //default 메소드에서 사용하는 변수 선언
@Override //turnOn() 추상 메소드의 실체 메소드
public void turnOn() {
System.out.println("Audio를 켭니다.");
}
@Override //turnOff() 추상 메소드의 실체 메소드
public void turnOff() {
System.out.println("Audio를 끕니다.");
}
@Override //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 { //volume이 MIN과 MAX 사이라면 (정상값)
this.volume = volume;
}
System.out.println("현재 Audio 볼륨: " + volume);
}
@Override //default 메소드 재정의
public void setMute(boolean mute) {
this.mute = mute;
if(mute) {
System.out.println("Audio 무음 처리합니다.");
} else {
System.out.println("Audio 무음 해제합니다.");
}
}
}
디폴트 메소드 사용
package sec04.exam02_default_method_use;
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc; //인터페이스 변수 선언
rc = new Television(); //Television 객체를 인터페이스 타입에 대입
rc.turnOn(); //Television 클래스에서 재정의된 메소드 호출
rc.setMute(true); //setMute() 메소드는 Television 클래스에서 재정의되지 않았으므로 RemoteControl 인터페이스의 디폴트 메소드가 호출됨
rc = new Audio(); //Audio 객체를 인터페이스 타입에 대입
rc.turnOn(); //Audio 클래스에서 재정의된 메소드 호출
rc.setMute(true); //Audio 클래스에서 재정의된 default 메소드 호출
}
}
TV를 켭니다.
무음 처리합니다.
Audio를 켭니다.
Audio 무음 처리합니다.
'Java > 8. 인터페이스 (Interface)' 카테고리의 다른 글
Day 11 : 자동 타입 변환 (promotion) (0) | 2021.11.02 |
---|---|
Day 11 : 정적 메소드 사용 (0) | 2021.11.02 |
Day 11 : 추상 메소드 사용 (0) | 2021.11.02 |
Day 11 : 인터페이스로 구현 객체 사용 (0) | 2021.11.02 |
Day 11 : 다중 인터페이스 구현 클래스 (0) | 2021.11.02 |