default method는 인터페이스에 있는 구현 메서드를 의미 합니다.
인터페이스에서는 구현부가 있는 메소드를 만들 수 없는 것이 기본적인 특징이나 예외적으로 디폴트 메서드를 만들 수 있습니다.
기존의 추상 메서드와 다른 점은 아래와 같습니다.
인터페이스에서 디폴트 메소드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위함 입니다.
기존 인터페이스의 이름과 추상 메소드의 변경 없이 디폴트 메소드만 추가 할 수 있기 때문에 이전에 개발된 구현 클래스를 그대로 사용할 수 있으면서 새롭게 개발하는 클래스는 디폴트 메소드를 활용할 수 있습니다.
public interface Interface {
// 추상 메서드
void abstractMethodA();
void abstractMethodB();
void abstractMethodC();
// default 메서드
default int defaultMethodA(){
...
}
}
디폴트 메소드는 인터페이스에 선언되지만, 인터페이스에서 사용 할 수 없습니다.
package 인터페이스3;
// 인터페이스에 포함되는 것들
// 상수 : 모든 필드는 자동으로 상수(final static)로 변환된다.
// 메소드 : 모든 메소드는 추상메소드로 변경된다. (자동으로 abstract 붙는다.)
// 디폴트메소드 : 구현부를 가짐. 상속 받은 클래스가 재정의 사용 가능
// 정적 메소드 : static, 객체와 상관없이 인터페이스 타입으로 사용
public interface RemoteControl {
int MAX_VOLUME = 100; // 자동으로 final static 이 붙는다.
int MIN_VOLUME = 0;
void turnON(); // 자동으로 abstract 가 붙는다.
void turnOFF();
void setVolume(int volume);
// 디폴트 메소드 : jdk 1.8 이후에 추가 됨, default 키워드를 사용 함
default void setMute(boolean mute) {
if(mute) System.out.println("무음 처리 합니다.");
else System.out.println("무음 해제 합니다.");
}
static void changeBattery() {
System.out.println("건전지를 교환 합니다.");
}
}
package 인터페이스3;
public class Audio implements RemoteControl {
private int volume;
@Override
public void turnON() {
System.out.println("Audio 를 켭니다.");
}
@Override
public void turnOFF() {
System.out.println("Audio 를 끕니다.");
}
@Override
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 {
this.volume = volume;
}
System.out.println("현재 Audio 볼륨 : " + this.volume);
}
void getInfo() {
System.out.println("오디오 입니다.");
System.out.println("현재 볼륨은 " + volume + " 입니다.");
}
@Override
public void setMute(boolean mute) {
if(mute) System.out.println("오디오를 무음 처리 합니다.");
else System.out.println("오디오 무음 처리 해제 합니다.");
}
}
package 인터페이스3;
public class Television implements RemoteControl {
private int volume;
@Override
public void turnON() {
System.out.println("TV 를 켭니다.");
}
@Override
public void turnOFF() {
System.out.println("TV 를 끕니다.");
}
@Override
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 {
this.volume = volume;
}
System.out.println("현재 TV 볼륨 : " + this.volume);
}
}
package 인터페이스3;
import java.util.Scanner;
public class RemoteMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("제품 선택 [1]TV, [2]Audio : ");
int selectMenu = sc.nextInt();
RemoteControl remoCon;
if(selectMenu == 1) {
remoCon = new Television();
remoCon.turnON();
remoCon.setVolume(20);
remoCon.setMute(true);
// 인터페이스 소속의 static 메소드
RemoteControl.changeBattery();
} else {
remoCon = new Audio();
remoCon.turnON();
remoCon.setVolume(30);
remoCon.setMute(true);
}
}
}