인터페이스는 두 객체를 연결해주는 다리이다.
상속 관계가 없는 다른 클래스들이 메서드를 구현해야 할 때, 인터페이스가 구현 클래스들의 동일한 사용방법과 행위를 보장해준다.
Interface 키워드를 사용하여 인터페이스를 선언할 수 있다.
인터페이스는 클래스와 마찬가지로 public, default 접근제어자를 지정할 수 있다.
인터페이스의 모든 맴버 변수는 public static final 이어야 한다. (생략 가능)
인터페이스의 모든 메서드는 public abstract 이어야 한다. (생략 가능, 단 static과 default 메서드는 예외이다.)
public interface Interface_A {
public static final char A = ‘A’;
static char B = ‘B’;
final char C = ‘C’;
char D = ‘D’; // 생략된 형태의 맴버 변수
void turnOn(); // public abstract void turnOn(); 과 같다.
}
인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스를 생성할 수 없다.
따라서 클래스에 구현되어 생성된다.
public class className implements interfaceName {
// 추상 메서드 오버라이딩
@Override public (return type) method name (parameter, ...) {
// 실행문
}
}
인터페이스끼리 역시 상속이 가능하다.
implements가 아닌 extends 키워드를 사용해서 상속을 받는다.
클래스와는 다르게 다중상속이 가능하다는 점이 중요하다.
public class Main implements C {
@Override
public void b() {
System.out.println("A");
}
@Override
public void b() {
System.out.println("B");
}
}
interface A {
void A();
}
interface B {
void B();
}
interface C extends A, B { } // 인터페이스 A, B를 다중상속, 추상 메서드 a, b 사용 가능
위 예시와 같이 인터페이스가 상속을 받으면 Main 클래스에서 인터페이스가 구현될 때, 부모의 추상 메서드가 오버라이딩 된다.
디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드이다.
메서드 앞에 default 키워드를 붙이며 블록이 존재해야 한다.
추상 메서드가 아니기 때문에 인터페이스 구현체에서 필수적으로 재정의할 필요는 없다.
인터페이스에서 static method 선언이 가능하다.
Static의 특성 그대로 인터페이스의 static method 역시 객체 없이 호출할 수 있다.
선언 방법은 클래스의 static method와 동일하다.
인터페이스의 타입변환은 두가지 변환 방식이 있는데, 자동 타입 변환과 강제 타입 변환이 있다.
자동 타입 변환
인터페이스 변수 = 구현 객체;
별다른 수식 없이 자동으로 타입이 변환되는 것을 의미한다.
강제 타입 변환
구현 객체 타입 변수 = (구현 객체 타입) 인터페이스 변수;
강제적으로 타입을 변환시키는 것을 의미한다.