인터페이스
- 자바에서 인터페이스는 객체의 사용 방법을 정의한 타입입니다.
- 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 합니다. 개발코드가 인텋페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킵니다. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 됩니다.
- 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
인터페이스 사용