자바 인터페이스(Java Interface)는 자바 프로그래밍 언어에서 추상적인 동작(기능)의 명세를 정의하는 참조형 타입이다. 클래스와는 달리 인터페이스는 행위(메서드 시그니처)만 정의하고, 실제 구현은 하지 않는다. 이는 일종의 "계약"을 명시하는 역할을 한다.
주요특징
추상 메서드의 집합
- 인터페이스는 기본적으로 메서드의 시그니처만 정의한다.
interface Animal {
void sound(); // 추상 메서드
}
interface Runnable {
void run(); // 추상 메서드
}
다중 구현이 가능
- 자바는 단일 상속만 지원하지만, 인터페이스는 여러 개 구현할 수 있음
class Dog implements Animal, Runnable {
public void sound() {
System.out.println("멍멍");
}
public void run() {
System.out.println("뛰는 중");
}
}
상수(static final)만 선언 가능
- 인터페이스에 선언된 변수는 **자동으로 public static final**이 됨.
interface Config {
int MAX = 100; // public static final int MAX = 100;
}
자바 8 이후로 default 및 static 메서드 사용 가능
- default 메서드는 인터페이스 내에서 구현을 가질 수 있음
interface Printer {
default void print() {
System.out.println("기본 출력");
}
static void staticMethod() {
System.out.println("정적 메서드");
}
}
자바 9 이후 private 메서드도 가능
- 자바 9부터 인터페이스에 private 메서드를 선언할 수 있다. 단, 다른 default 또는 static 메서드에서만 호출 가능하고, 외부 클래스나 구현체에서는 사용할 수 없다
interface Logger {
default void logInfo(String message) {
log("[INFO] " + message);
}
default void logError(String message) {
log("[ERROR] " + message);
}
private void log(String message) {
System.out.println(currentTime() + " " + message);
}
private static String currentTime() {
return java.time.LocalTime.now().toString();
}
}
인터페이스 vs 추상 클래스
| 인터페이스 | 추상 클래스 | |
| 다중상속 | 가능 | 불가능 |
| 필드선언 | 상수만 가능함 | 일반변수 선언 가 |
| 메서드 구현 가능 여부 | Java 8부터 default, static 지원 | 추상 메서드 + 일반 메서드 가 |
| 생성자 | X | O |