Default Method

hovi·2023년 5월 30일
0

JAVA

목록 보기
13/36

디폴트 메소드?

default method는 인터페이스에 있는 구현 메서드를 의미 합니다.

인터페이스에서는 구현부가 있는 메소드를 만들 수 없는 것이 기본적인 특징이나 예외적으로 디폴트 메서드를 만들 수 있습니다.

기존의 추상 메서드와 다른 점은 아래와 같습니다.

  • 메서드 앞에 default 예약어를 붙인다.
  • 구현부 { }가 있어야 한다.

디폴트 메소드가 필요한 이유

인터페이스에서 디폴트 메소드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위함 입니다.

기존 인터페이스의 이름과 추상 메소드의 변경 없이 디폴트 메소드만 추가 할 수 있기 때문에 이전에 개발된 구현 클래스를 그대로 사용할 수 있으면서 새롭게 개발하는 클래스는 디폴트 메소드를 활용할 수 있습니다.

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("건전지를 교환 합니다.");
    }

}

인터페이스 상속 (Audio)

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("오디오 무음 처리 해제 합니다.");
    }
}

인터페이스 상속 (Television)

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);
    }
}

Main

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);
        }

    }
}
profile
풀스택 예비 개발자

0개의 댓글