객체 지향 프로그래밍 - 인터페이스
정적 메소드
한모로그
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();
}
}