자바에서 인터페이스(interface)는 다른 인터페이스를 구현(implement)할 수 없습니다. 그 이유를 이해하려면 먼저 인터페이스의 기본적인 특성부터 살펴볼 필요가 있습니다.
인터페이스의 기본 특성
- 자바에서 인터페이스는 본질적으로 특수한 형태의 클래스입니다. 클래스처럼 메서드와 변수를 포함할 수 있지만, 클래스와 달리 항상 완전히 추상적(abstract)이라는 점이 다릅니다.
- 인터페이스는
class키워드 대신interface키워드를 사용한다는 점을 제외하면 클래스와 비슷한 방식으로 정의합니다. - 인터페이스 내부에 선언된 변수는 자동으로 static이면서 final로 취급되며, 선언된 메서드는 암묵적으로 public abstract 상태가 됩니다.
인터페이스는 확장은 가능하지만 구현은 불가능
인터페이스는 extends 키워드를 통해 여러 개의 인터페이스를 동시에 확장(extend)할 수 있습니다. 그러나 다른 인터페이스를 구현(implement)하는 것은 허용되지 않습니다.
그 이유는 간단합니다. 어떤 요소가 인터페이스를 구현하면 해당 인터페이스의 모든 추상 메서드에 대한 실제 구현 코드(메서드 본문)를 반드시 작성해야 합니다. 하지만 인터페이스는 정의상 어떠한 메서드도 구현하지 않는 완전한 추상 타입이므로, 메서드 본문을 제공할 방법이 없습니다. 따라서 인터페이스가 다른 인터페이스를 구현하는 것은 논리적으로 성립하지 않습니다.
만약 인터페이스 안에서 implements 키워드를 사용해 다른 인터페이스를 구현하려고 시도하면, 자바 컴파일러는 컴파일 타임 오류를 발생시킵니다.
예제 코드
interface MainInterface {
void mainMethod();
}
interface SubInterface extends MainInterface {
// 만약 extends 대신 implements 키워드를 사용하면
// 컴파일러가 오류를 발생시킵니다.
void subMethod();
}
class MainClass implements MainInterface {
public void mainMethod() {
System.out.println("Main Interface Method");
}
public void subMethod() {
System.out.println("Sub Interface Method");
}
}
public class Test {
public static void main(String args[]) {
MainClass main = new MainClass();
main.mainMethod();
main.subMethod();
}
}실행 결과
Main Interface Method Sub Interface Method
정리
- 인터페이스는
extends로 다른 인터페이스를 확장할 수 있으며, 이때는 여러 인터페이스를 동시에 상속받을 수 있습니다. - 인터페이스는
implements로 다른 인터페이스를 구현할 수 없으며, 시도하면 컴파일 오류가 발생합니다. - 구현(implement)은 반드시 클래스가 담당하며, 클래스는 하나 이상의 인터페이스를 구현해 메서드 본문을 직접 작성해야 합니다.