한모로그 2023. 1. 21. 12:41

정적 메소드

  • 구현 객체가 없어도 인터페이스만으로 호출할 수 있음
  • 선언 시 public을 생략하더라도 자동으로 컴파일 과정에서 붙음


    출처, 이것이 자바다


  • 정적 실행부를 작성할 때 상수 필드를 제외한 추상 메소드, 디폴트 메소드, private 메소드 등을 호출할 수 없음
package ch08.sec06;

//인터페이스
public interface RemoteControl {

    //상수필드. 컴파일시 public static final
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;

    //추상메소드(미완성 메소드). 컴파일시 public abstract
    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("무음 해제합니다.");
        }
    }

    //정적 메소드
    static void changeBattery() {
        System.out.println("리모콘 건전지를 교환합니다.");
    }
}

package ch08.sec06;

//구현클래스, 추가기능 작업이 필요가 없어서 , 디폴트 메소드 재정의작업을 안함.
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 ch08.sec06;

//구현클래스
public class Audio implements RemoteControl {

    //필드
    private int volume;

    //구현(재정의) : 완성메소드
    @Override
    public void turnOn() {
        System.out.println("Audio를 켭니다.");

    }

    @Override
    public void turnOff() {
        System.out.println("Audio를 끕니다.");

    }

    //private int volume; 필드의 setter메소드 기능
    @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);
    }

    //필드
    private int memoryVolume;

    //Audio클래스만 추가기능이 필요하여, 재정의를 통한 작업
    //디폴트 메소드 재정의
    @Override
    public void setMute(boolean mute) {
        if(mute) {
            this.memoryVolume = this.volume;
            System.out.println("무음 처리합니다.");
            setVolume(RemoteControl.MIN_VOLUME);
        }else {
            System.out.println("무음 해제합니다.");
            setVolume(this.memoryVolume);
        }
    }
}

package ch08.sec06;

public class Aircon implements RemoteControl {

    private int volume;

    @Override
    public void turnOn() {
        System.out.println("Aircon을 켭니다.");

    }

    @Override
    public void turnOff() {
        System.out.println("Aircon을 끕니다.");

    }

    @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("현재  Aircon 온도: " + this.volume);
    }

}

package ch08.sec06;

public class RemoteControlExample {

    public static void main(String[] args) {

        RemoteControl rc;

        //부모인터페이스 변수에 대입. 자동형변환
//        rc = new Television();
//        rc.turnOn();
//        rc.setVolume(5);
//        rc.turnOff();

        //System.out.println();

        //부모인터페이스 변수에 대입. 자동형변환
//        rc = new Audio();
//        rc.turnOn();
//        rc.setVolume(5);
//        rc.turnOff();

        //System.out.println();

//        rc = new Aircon();
//        rc.turnOn();
//        rc.setVolume(7);
//        rc.turnOff();

        remoteControl(new Television());
        remoteControl(new Audio());
        remoteControl(new Aircon());

    }

    //매개변수 다형성 : 중복된 코드를 줄이고, 유지보수 작업시 수정작업이 용이하게 됨.
    public static void remoteControl(RemoteControl rc) {

        int volume = 0;
        if(rc instanceof Television) {
            volume = 5;
        }else if(rc instanceof Audio) {
            volume = 7;
        }else if(rc instanceof Aircon) {
            volume = 9;
        }

        rc.turnOn();
        rc.setVolume(volume);
        rc.turnOff();

        //정적 메소드 호출
        RemoteControl.changeBattery();
    }
}