Java 인터페이스 완벽 해설: 정의, 구현, 실전 예제
Java 인터페이스란?
Java 인터페이스는 클래스에 대한 계약을 정의하는 추상 타입입니다. 상수와 추상 메서드를 선언할 수 있지만 상태를 가질 수는 없습니다. 모든 메서드는 암시적으로 public이고 abstract이며, 클래스는 여러 인터페이스를 구현하여 요구된 동작을 제공할 수 있습니다.
인터페이스 선언
interface MyInterface {
// 추상 메서드
}
인터페이스 구현
class Dog implements Pet {
// Pet의 메서드 구현
}
인터페이스 확장
interface RidableAnimal extends Animal, Vehicle {
// 추가 추상 메서드
}
왜 인터페이스가 필요한가?
인터페이스는 무엇(what)을 어떻게(how)에서 분리합니다. 다형성을 가능하게 하고, 느슨한 결합을 촉진하며, Java가 클래스에 대해 지원하지 않는 '다중 상속' 문제를 해결합니다.
예를 들어 MediaPlayer는 별도의 CDPlayer와 DVDPlayer 서브클래스를 가질 수 있으며, 각각 고유한 play() 구현을 제공합니다. 한 클래스가 두 기능이 모두 필요하면 Java는 클래스의 다중 상속을 금지하지만, 인터페이스로 행동을 깔끔하게 결합할 수 있습니다.


마찬가지로 Dog 클래스는 Animal을 확장하고 Pet 인터페이스를 구현하여 상속과 계약 의무를 모두 충족할 수 있습니다.

Java 인터페이스 예제
1단계: 다음 코드 작성:
interface Pet {
void test();
}
class Dog implements Pet {
@Override
public void test() {
System.out.println("Interface method implemented");
}
public static void main(String[] args) {
Pet p = new Dog();
p.test();
}
}
2단계: 컴파일하고 실행하여 출력 확인.
클래스 vs 인터페이스
| 클래스 | 인터페이스 |
| 인스턴스화 가능하며 상태를 가질 수 있음 | 인스턴스화 불가, 상수와 메서드 시그니처만 포함 |
| 구현된(구체적) 메서드 가질 수 있음 | Java 8 이전까지 구현된 메서드 불가; Java 8부터 default, static 메서드 가능 |
접근 제어자: private, protected, public | 모든 멤버 암시적으로 public (필드는 static final) |
인터페이스 vs 추상 클래스: 언제 무엇을 쓸까?
- 추상 클래스: 관련 클래스들에 공통 기본 구현이나 공유 상태가 필요할 때
- 인터페이스: 관련 없는 클래스들이 채택할 수 있는 역할이나 역량을 정의할 때
인터페이스 핵심 사실
- 클래스는 여러 인터페이스를 구현 가능, 선언된 모든 메서드 구현 필수
- 인터페이스는 직접 인스턴스화 불가, 계약 역할만 수행
- 인터페이스 참조는 구현 클래스 아무거나 가리킬 수 있음
- 인터페이스는 하나 이상의 다른 인터페이스를 확장 가능
- 다른 인터페이스나 클래스 내에 중첩 인터페이스 허용
- 한 클래스가 두 인터페이스를 구현할 때 같은 이름인데 반환 타입이 다른 메서드 선언 불가
- Java 8부터 인터페이스에
default, static 메서드 포함 가능
요약
- 인터페이스는 계약을 정의, 클래스가 구현 제공
- 모든 인터페이스 메서드는 암시적으로
public, abstract (default/static 제외)
- 인터페이스 인스턴스화 불가하지만 변수로 참조 가능
- 다형성 달성과 Java의 단일 상속 제한 우회에 인터페이스 활용