인터페이스(interface)
- 클래스의 객체가 개별적인 리모컨이라면, 인터페이스는 그 리모컨의 설계도와 같다.
- 인터페이스 내의 메서드는 public인 동시에 abstract이다. 어느 패키지에서나 접근가능하며, 인터페이스의 메서드는 추상 메서드이므로 메서드의 내용을 갖지 않는다.
- 아래의 코드 예에서 보면, 리모컨은 putOn과 putOff라는 기능을 가진다는 설계도(interface)를 가지고 리모컨 객체를 제작한다고 생각할 수 있다.
public interface Wearable {
void putOn(); // 입기
void putOff(); // 벗기
}
인터페이스의 구현
- 인터페이스를 구현한 인터페이스에 따라서 메서드의 내용을 정의한다.
- 구현 클래스는 구현할 인터페이스를
implements
라는 키워드를 이용하여 지정한다.
public class HeadPhone implements Wearable{
int volume =0;
public void putOn() {
System.out.println("헤드폰을 착용했습니다.");
}
public void putOff() {
System.out.println("헤드폰을 벗었습니다.");
}
public void setVolume(int volume) {
this.volume = volume;
System.out.println("볼륨을 "+volume+"로 변경했습니다.");
}
}
public class WearableComputer {
public void putOn() {
System.out.println("컴퓨터를 실행했습니다.");
}
public void putOff() {
System.out.println("컴퓨터를 껐습니다.");
}
public void reset() {
System.out.println("컴퓨터를 재시작했습니다.");
}
}
메서드의 구현
- HeadPhone과 WearableComputer 리모컨은 모두 putOn과 putOff 메서드를 구현한다.
- 인터페이스형 인스턴스는 생성할 수 없다.
- 인터페이스형 변수는 그것을 구현한 클래스의 인스턴스를 참조할 수 있다.
구현한 클래스의 사용
public class WearableTester {
public static void main(String[] args) {
Wearable[] a = new Wearable[2];
a[0] = new HeadPhone();
a[1] = new WearableComputer();
for(int i=0; i<a.length;i++)
a[i].putOn();
for(int i=0; i<a.length;i++)
a[i].putOff();
}
}
결과
헤드폰을 착용했습니다.
컴퓨터를 실행했습니다.
헤드폰을 벗었습니다.
컴퓨터를 껐습니다.
인터페이스의 멤버
- 클래스
- 상수(public static final 조건: 변경 불가)
- 인터페이스
- 추상 메서드(public abstract 메서드)
클래스의 파생과 인터페이스의 차이점
- 클래스는 단일 상속만 인정하지만, 인터페이스는 복수의 인터페이스를 구현할 수 있다.
public interface Skinny {
...
}
public class NewWearableDevice implements Wearable, Skinnalbe{
...