본문 바로가기

JAVA

[JAVA] 인터페이스란?

🔗 인터페이스(Interface)

인터페이스는 **다중 구현(다중 상속)**을 지원한다.

  • 인터페이스는 class 대신 interface 키워드로 선언한다.
  • 인터페이스 내에 메서드 선언은 순수 추상 클래스처럼 추상 메서드만 선언해야 하는데, public abstract를 생략해도 된다 (권장).
  • 인터페이스를 상속받을 때는 extends 대신 implements(구현) 키워드를 사용해야 한다. 그래서 상속이라고 안 하고 구현이라고 표현한다.
  • 클래스, 추상 클래스, 인터페이스는 프로그램 코드나 메모리 구조상 모두 똑같다.

➡️ 상속 vs. 구현

부모 클래스의 기능을 자식 클래스가 상속받을 때, 클래스는 상속받는다고 표현하지만, 부모 인터페이스의 기능을 자식이 상속받을 때는 인터페이스를 구현한다고 표현한다.

왜냐하면, 상속의 경우 부모의 기능을 물려받는 것이 목적이지만, 인터페이스의 경우에는 모든 메서드가 추상 메서드로 정의되어 있어서 기능 자체가 없다. 따라서 물려받을 기능은 없고, 오히려 인터페이스에 정의된 이 기능을 자식이 직접 반드시 오버라이딩하여 기능을 구현해야 한다. 그렇기에 구현한다는 표현을 사용한다.

인터페이스는 메서드 이름만 있는 설계도이고, 이 설계도의 실제 작동은 하위 클래스에서 모두 구현해야 한다. 그렇기에 해당 인터페이스를 구현한다고 표현한다.


💡 인터페이스를 사용해야 하는 이유

모든 메서드가 추상 메서드라면 순수 추상 클래스를 만들어도 되고 인터페이스를 만들어도 되는데, 왜 인터페이스를 사용하는가? 편리한 것 이외에도 다음과 같은 이유가 있다.

  • 강력한 규약 제공: 인터페이스를 만드는 주된 이유는 인터페이스 구현 시, 인터페이스의 메서드를 반드시 구현해야 한다는 규약(제약)을 주는 것이다. USB 인터페이스를 예로 들면, 그 인터페이스 규격에 맞추어 키보드나 마우스를 개발, 연결해야만 작동한다.
  • 유연성과 느슨한 결합: 인터페이스는 특정 구현체에 의존하지 않고 추상적인 계약을 통해 코드를 더 유연하게 만들고, 변화에 강하게 한다. 이는 **느슨한 결합(Loose Coupling)**을 가능하게 하여 유지보수성을 높인다.
  • 다중 구현 지원: 자바에서 클래스 상속은 단일 상속만 지원하지만, 인터페이스는 여러 인터페이스를 동시에 구현하는 다중 구현을 허용하여 다형성을 더욱 강력하게 활용할 수 있게 한다.

반면 순수 추상 클래스의 경우, '순수 추상 클래스'라는 게 명확히 정해져 있는 게 아니다. 추상 클래스의 모든 메서드가 추상 메서드일 때 그렇게 불릴 뿐, 만약 여기에 일반 메서드를 끼워 넣는다면, 이건 순수 추상 클래스가 아닌 그냥 추상 클래스가 된다. 그렇게 되면 자식은 그 일반 메서드를 꼭 오버라이딩할 필요도 없다.

다시 강조하자면, 인터페이스는 모든 메서드가 추상 메서드이고, 구현해야 한다는 것이 규약으로 정해져 있다. 문제의 원인이 원천 차단되는 것이다.


➕ 인터페이스의 다중 구현

자바에서는 클래스 상속은 부모를 하나만 지정 가능하지만, 인터페이스는 부모를 여러 명 지정하는 다중 구현이 가능하다. 그 이유는 인터페이스는 모두 추상 메서드로 이루어져 있기 때문이다. (메서드 충돌 등의 복잡한 문제가 발생할 여지가 없다.)


🛠️ 클래스와 인터페이스 활용

클래스와 인터페이스를 같이 사용할 수 있다. extends는 하나만 상속받을 수 있으므로 먼저 쓰고, implements는 다중 구현이 가능하므로 뒤에다가 쓴다.

public class MyClass extends ParentClass implements InterfaceA, InterfaceB {
    // ParentClass의 필드와 메서드를 상속받고
    // InterfaceA와 InterfaceB에 정의된 추상 메서드를 반드시 구현해야 한다.
    @Override
    public void methodFromInterfaceA() {
        // 구현 내용
    }

    @Override
    public void methodFromInterfaceB() {
        // 구현 내용
    }
}

이 조합을 통해 단일 상속의 한계를 극복하면서도, 여러 인터페이스의 기능을 동시에 구현하여 더욱 유연하고 확장성 있는 클래스를 설계할 수 있다. 예를 들어, Car 클래스가 Vehicle을 상속받으면서 Chargeable 인터페이스와 Driveable 인터페이스를 동시에 구현하는 식으로 설계할 수 있다.

'JAVA' 카테고리의 다른 글

삼항 연산자  (0) 2026.03.13
[JAVA] 추상 클래스와 메서드  (0) 2025.09.24
[JAVA] 다형성과 중요한 개념들.  (0) 2025.09.22
[JAVA] 상속과 super  (0) 2025.09.20
[JAVA] final이란?  (0) 2025.09.17