이번 글에서는 자바 8부터 지원되는 인터페이스의 default 메서드를 학습합니다.
기존에는 인터페이스에 메서드의 선언만 가능했지만,
이제는 default를 통해 기본 구현까지 포함 가능하며,
필요에 따라 구현 클래스에서 오버라이딩도 가능합니다.
📦 인터페이스 코드 (RemoteControl.java)
package ch08.sec05;
public interface RemoteControl {
int MAX_VOLUME = 10;
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("무음 해제합니다.");
}
}
}
✔ default 메서드는 몸체를 가진 메서드
✔ 구현 클래스가 오버라이딩하지 않아도 자동 사용됨
📦 구현 클래스 – TV (Television.java)
package ch08.sec05;
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 > MAX_VOLUME)
this.volume = MAX_VOLUME;
else if (volume < MIN_VOLUME)
this.volume = MIN_VOLUME;
else
this.volume = volume;
System.out.println("현재 TV 볼륨 : " + this.volume);
}
}
✔ setMute()를 오버라이딩하지 않음 → 인터페이스 기본 구현 사용
📦 구현 클래스 – 오디오 (Audio.java)
package ch08.sec05;
public class Audio implements RemoteControl {
private int volume;
private int memoryVolume;
public void turnOn() {
System.out.println("Audio를 켭니다.");
}
public void turnOff() {
System.out.println("Audio를 끕니다.");
}
public void setVolume(int volume) {
if (volume > MAX_VOLUME)
this.volume = MAX_VOLUME;
else if (volume < MIN_VOLUME)
this.volume = MIN_VOLUME;
else
this.volume = volume;
System.out.println("현재 Audio 볼륨 : " + this.volume);
}
@Override
public void setMute(boolean mute) {
if (mute) {
this.memoryVolume = this.volume;
System.out.println("무음 처리합니다.");
setVolume(MIN_VOLUME);
} else {
System.out.println("무음 해제합니다.");
setVolume(this.memoryVolume);
}
}
}
✔ setMute()를 오버라이딩하여 음소거 전 볼륨 복원 기능 구현
📌 실행 코드 (RemoteControlExample.java)
package ch08.sec05;
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc = new Television();
rc.turnOn();
rc.setVolume(5);
rc.setMute(true); // default 메서드 실행
rc.setMute(false); // default 메서드 실행
System.out.println();
rc = new Audio();
rc.turnOn();
rc.setVolume(5);
rc.setMute(true); // 오버라이딩된 메서드 실행
rc.setMute(false); // 오버라이딩된 메서드 실행
}
}
🖥 실행 결과
TV를 켭니다.
현재 TV 볼륨 : 5
무음 처리합니다.
현재 TV 볼륨 : 0
무음 해제합니다.
Audio를 켭니다.
현재 Audio 볼륨 : 5
무음 처리합니다.
현재 Audio 볼륨 : 0
무음 해제합니다.
현재 Audio 볼륨 : 5
📌 간단 정리
구현 클래스 |
setMute() 동작 방식 |
Television |
인터페이스의 기본 구현 사용 |
Audio |
오버라이딩하여 볼륨 복원 기능 포함 |
💡 포인트 정리
- default 메서드는 인터페이스 내에서 기본 구현을 제공
- 구현 클래스에서 오버라이딩 가능
- 인터페이스 변경 시 기존 구현 클래스에 영향 최소화
- 실무에서는 기본 동작을 인터페이스에서 제공하고,
특수한 클래스에서만 오버라이딩하는 구조로 사용됨
📌 정리하자면,
default 메서드는 인터페이스가 더 유연한 확장을 가능하게 하며, 공통 기능을 강제하지 않고 제공할 수 있는 방법입니다.