상속 관계가 없는 다른 클래스들이 공통된 메서드를 구현해야할 때 인터페이스는 구현 클래스들의 동일한 사용방법과 행위를 보장한다.
public interface 인터페이스명 {...}
// public, defalut 접근 제어자를 지정 가능
public static final 이여야 한다.(생략 가능)public abstract 이어야 한다.(생략 가능) public class 클래스명 implements 인터페이스명 {
// 추상 메서드 오버라이딩
@Override
public 리턴타입 메서드이름(매개변수, ...) {
// 실행문
}
}
extends 키워드를 사용한다. 디폴트 메서드 는 추상 메서드의 기본적인 구현을 제공하는 메서드이다.
default 키워드를 붙인다.public class Main implements A {
@Override
public void a() {
System.out.println("A");
}
public static void main(String[] args) {
Main main = new Main();
main.a();
// 디폴트 메서드 재정의 없이 바로 사용가능합니다.
main.aa();
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
}
인터페이스에서 static 메서드 선언이 가능하다.
인터페이스의 타입변환은 클래스와 마찬기지로 사용가능한 멤버필드와 메서드가 한정된다.
자동 타입변환 : 인터페이스 변수 = 구현객체;
강제 타입변환 : 구현객체타입 변수 = (구현객체타입) 인터페이스변수;
// LG TV 구현체를 조작
// MultiRemoteController 인터페이스
MultiRemoteController mrc = new LgTv("LG");
mrc.turnOnOff();
mrc.volumeUp();
// 조작 대상을 Samsung TV로 교체
// TV 구현객체의 기능을 조작 가능하다.
mrc = new SamsungTv("Samsung");
mrc.turnOnOff();
mrc.channelUp();
// 매개변수와 반환타입 다형성 확인 메서드
// return 값은 (SamsungTv) tv 이다.
default MultiRemoteController getTV(Tv tv) {
if(tv instanceof SamsungTv) {
return (SamsungTv) tv;
} else if(tv instanceof LgTv){
return (LgTv) tv;
} else {
throw new NullPointerException("일치하는 Tv 없음");
}
}
이번시간에는 인터페이스의 개념과 다양한 메서드들을 알아 보았다.
활용도가 높은 인터페이스의 다형성에 관한 특성도 배우는 시간이였다.