Java/8. 인터페이스 (Interface)

Day 11 : 구현 클래스

pancakemaker 2021. 11. 2. 18:40

- 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스명을 명시해야 한다.

 

public class 구현클래스명 implements 인터페이스명 {

}

 

- 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 한다.

 

인터페이스

package sec03.exam01_name_implement_class;

public interface RemoteControl {
	//상수 필드
	public static final int MAX_VOLUME = 10;
	int MIN_VOLUME = 0; //public static final 생략 가능 -> 컴파일 과정에서 자동으로 붙음
	
	//추상 메소드 - 선언부만 작성하고 실행내용은 작성x
	public abstract void turnOn();
	void turnOff(); //public abstract 생략 가능 -> 컴파일 과정에서 자동으로 붙음
	void setVolume(int volume);	
	
	//디폴트 메소드 - java 8 버전 부터 - 실행내용 작성O - default 키워드 꼭 작성해야함!
	public default void setMute(boolean mute) { //public 생략 가능 -> 컴파일 과정에서 자동으로 붙음
		if(mute) {
			System.out.println("무음 처리합니다.");
		} else {
			System.out.println("무음 해제합니다.");
		}
	}
	
	//정적 메소드 - java 8 버전 부터 - 실행내용 작성O - static 키워드 꼭 작성해야함!
	public static void changeBattery() {
		System.out.println("건전지를 교환합니다."); //public 생략 가능 -> 컴파일 과정에서 자동으로 붙음
	}
}

 

구현 클래스

package sec03.exam01_name_implement_class;

public class Television implements RemoteControl { //만약 추상메소드의 실체 메소드를 선언하지 않거나, 일부만 선언하는 경우 abstract class 가 되어야한다.
	//필드
	private int volume;
	
	@Override //turnOn() 추상 메소드의 실체 메소드
	public void turnOn() {
		System.out.println("TV를 켭니다.");
	}

	@Override //turnOff() 추상 메소드의 실체 메소드
	public void turnOff() {
		System.out.println("TV를 끕니다.");
	}

	@Override //setVolume() 추상 메소드의 실체 메소드
	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 { //volume이 MIN과 MAX 사이라면 (정상값)
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨: " + volume);
	}
}
package sec03.exam01_name_implement_class;

public class Audio implements RemoteControl { //만약 추상메소드의 실체 메소드를 선언하지 않거나, 일부만 선언하는 경우 abstract class 가 되어야한다.
	//필드
	private int volume;
	
	@Override //turnOn() 추상 메소드의 실체 메소드
	public void turnOn() {
		System.out.println("Audio를 켭니다.");
	}

	@Override //turnOff() 추상 메소드의 실체 메소드
	public void turnOff() {
		System.out.println("Audio를 끕니다.");
	}

	@Override //setVolume() 추상 메소드의 실체 메소드
	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 { //volume이 MIN과 MAX 사이라면 (정상값)
			this.volume = volume;
		}
		System.out.println("현재 Audio 볼륨: " + volume);
	}
}

 

- 만약 인터페이스에 선언된 추상 메소드에 대응하는 실체 메소드를 구현 클래스에 작성하지 않거나 일부만 구현한다면, 구현 클래스는 추상 클래스로 만들어줘야한다.

 

public abstract class 구현클래스명 implements 인터페이스명 {}

 

- 인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 한다.

 

인터페이스 변수;

변수 = 구현객체;

or

인터페이스 변수 = 구현객체;

 

인터페이스 변수에 구현 객체 대입

package sec03.exam01_name_implement_class;

public class RemoteControlExample {
	public static void main(String[] args) {
		RemoteControl rc;
		//RemoteControl rc = new RemoteControl(); //불가 -> RemoteControl 인터페이스에는 생성자가 없음
		rc = new Television();
		//RemoteControl rc = new Television(); //가능
		rc = new Audio();	
		//RemoteControl rc = new Audio(); //가능
	}
}