인터페이스는 추상메소드와 상수(static final
)만을 멤버로 갖는다. jdk1.8이상에서는 static메소드와 default메소드도 멤버로 가질 수 있다.
추상 클래스보다 추상화 정도가 높다고 할 수 있다.
인터페이스는 다음과 같이 작성한다.
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3; // public static final int DIAMOND
static int HEART = 2; // public static final int HEART
int CLOVER = 1; // public static final int CLOVER
public abstract String getCardNumber();
String getCardKind(); // public abstract String getCardKind();
}
모든 멤버는 public static final
이고, 모든 메소드는 public abstract
이다. 컴파일러가 자동으로 추가해준다. static, default메소드는 예외이다.
인터페이스끼리는 상속을 할 수 있다. 다중 상속도 가능하다.
Object클래스 같은 최고 조상은 없다.
extends
를 사용한다.
인터페이스는 클래스를 통해 구현된다. 이때는 implements
키워드를 사용하며, 여러개의 인터페이스를 구현할 수 있다.
조상의 메소드를 오버라이딩 할 때나, 인터페이스를 구현 할 때나 마찬가지로, 조상의 접근제어자보다 넓은 범위의 접근제어자를 사용해야한다.
자바는 다중상속을 할 수 없기에 다중상속의 장점을 잃게된다.
<aside> 💡 다중 상속의 장점은?
</aside>
인터페이스를 통해 구현할 수 있는데, 한쪽은 상속을 받고, 한쪽은 포함관계로 구현한다.
인터페이스를 통해 구현해야하는 메소드를 만들어 두고, 나머지 클래스를 포함관계로 해서 다중상속처럼 사용할 수 있다.
연관이 없는 클래스들 사이에 인터페이스를 통하여 관계를 줄 수 있다.