인터페이스

- 자바에서 인터페이스는 객체의 사용 방법을 정의한 타입입니다.

- 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 합니다. 개발코드가 인텋페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킵니다. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 됩니다.

- abstract class가 interface class명 똑같다고 보면됨

- 추상클래스랑 똑같다고 보면 되는데 동작에 특화된?

- interface에서  face는 객체라고 생각 inter는 객체와 객체 사이? 느낌

- **상수 필드 선언**

   → 데이터를 저장할 인스턴스 혹은 정적 필드 선언 불가.

   → 상수 필드만 선언 가능

public interface RemoteControl{
// [] 안에 문장 생략 가능
 [pubic static final] public int MAX_VOLUME = 10;
}
 - 추상 메소드 선언

    [public abstract] 리턴타입 메소드이름(매개변수);
public interface RemoteControl {
	//상수
	public int MAX_VOLUME = 10;
	public int MIN_VOLUME = 0;
	
	//추상 메소드
	public void turnOn();         //메소드 선언부만 작성
	public void turnOff();
	public void setVolume(int volume);
}
-------------------------------------------------------------
public class Television implements RemoteControl {
	//필드
	private int volume;
	
	//turnOn() 추상 메소드의 실체 메소드
	public void turnOn() {
		System.out.println("TV를 켭니다.");
	}
	
	//turnOff() 추상 메소드의 실체 메소드
	public void turnOff() {
		System.out.println("TV를 끕니다.");
	}
	
	//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 {
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨:" + this.volume);
	}
}
------------------------------------------------------------
public class Audio implements RemoteControl{
	//필드
	private int volume;
	
	//turnOn() 추상 메소드의 실체 메소드
	public void turnOn() {
		System.out.println("Audio를 켭니다.");
	}
	
	//turnOff() 추상 메소드의 실체 메소드
	public void turnOff() {
		System.out.println("Audio를 끕니다.");
	}
	
	//setVolume() 추상 메소드의 실체 메소드
	public void setVolume(int volume) {       
		if(volume>RemoteControl.MAX_VOLUME) {     //인터페이스 상수를 이용해서 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);
	}
}
--------------------------------------------------------------------------------------
public class RemoteControlExample {

	public static void main(String[] args) {
		//이런식으로 공유가 가능 해당 객체 생성 전까지  
		RemoteControl rc;
		 rc = new Television();
		 rc.turnOn();
		 rc.turnOff();
		 rc.setVolume(10);
		 rc = new Audio();
		 rc.turnOn();
		 rc.turnOff();
		 rc.setVolume(5);
	}

}
result:
TV를 켭니다.
TV를 끕니다.
현재 TV 볼륨:10
Audio를 켭니다.
Audio를 끕니다.
현재 Audio 볼륨:10

다중 인터페이스 구현 클래스

public interface Searchable {
	void search(String url);
}

------------------------------------------------------
public interface RemoteControl {
	//상수
	public int MAX_VOLUME = 10;
	public int MIN_VOLUME = 10;
	
	//추상 메소드
	public void turnOn();         //메소드 선언부만 작성
	public void turnOff();
	public void setVolume(int volume);
}

--------------------------------------------------------
public class SmartTelevision implements RemoteControl, Searchable {
	private int volume;
	//turnOn() 추상 메소드의 실체 메소드
	
		public void turnOn() {
			System.out.println("TV를 켭니다.");
		}
		
		//turnOff() 추상 메소드의 실체 메소드
		public void turnOff() {
			System.out.println("TV를 끕니다.");
		}
		
		//setVolume() 추상 메소드의 실체 메소드
		public void setVolume(int volume) {       
			if(volume>RemoteControl.MAX_VOLUME) {     //인터페이스 상수를 이용해서 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);
		}
		public void search(String url) {
			System.out.println(url + "을 검색합니다.");
		}
}
--------------------------------------------------------------
public class SmartTelevisionExample {

	public static void main(String[] args) {
		SmartTelevision tv = new SmartTelevision();
		
		RemoteControl rc = tv;
		Searchable searchable = tv;
		searchable.search("asdasd");
		rc.setVolume(15);
	}

}

result:
asdasd을 검색합니다.
현재 TV 볼륨:10

인터페이스 사용