본문 바로가기

반응형

이번 글에서는 자바 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 메서드는 인터페이스가 더 유연한 확장을 가능하게 하며, 공통 기능을 강제하지 않고 제공할 수 있는 방법입니다.

댓글