
Chapter 8. 인터페이스
8.1 인터페이스 역할
- 객체 간의 책임 분리와 간접적 협력을 가능하게 한다.
- 변경에 따른 영향 최소화.
- 다형성 구현의 핵심 기술 (상속보다 더 자주 사용).
8.2 인터페이스와 구현 클래스 선언
- 인터페이스 선언
public interface RemoteControl {
void turnOn();
void turnOff();
}
- 구현 클래스 선언
public class TV implements RemoteControl {
@Override
public void turnOn() { System.out.println("TV ON"); }
@Override
public void turnOff() { System.out.println("TV OFF"); }
}
- 변수 선언과 객체 대입
RemoteControl rc;
rc = new TV();
rc.turnOn();
8.3 상수 필드
- 인터페이스 필드는 자동으로
public static final.
interface RemoteControl {
int MAX_VOLUME = 10;
}
8.4 추상 메소드
- 구현 클래스가 반드시 재정의해야 하는 메소드.
public abstract는 생략 가능.
interface RemoteControl {
void setVolume(int volume);
}
8.5 디폴트 메소드
- 실행 코드가 포함된 메소드 (
default 키워드).
- 필요 시 구현 클래스에서 오버라이딩 가능.
interface RemoteControl {
default void setMute(boolean mute) {
if (mute) System.out.println("무음 처리");
else System.out.println("무음 해제");
}
}
class TV implements RemoteControl {
@Override
public void setMute(boolean mute) {
System.out.println("TV 전용 무음 기능");
}
}
8.6 정적 메소드
- 구현 객체 없이 인터페이스명으로 호출.
- 다른 인스턴스 멤버(추상/디폴트 메소드 등)는 호출 불가.
interface RemoteControl {
static void changeBattery() {
System.out.println("건전지 교환");
}
}
RemoteControl.changeBattery();
8.7 private 메소드
- 인터페이스 내부에서 공용 기능 분리 용도로 사용.
- private 인스턴스 메소드 → 디폴트 메소드에서 호출 가능.
- private static 메소드 → 정적 메소드/디폴트 메소드에서 호출 가능.
interface MyInterface {
private void commonTask() { System.out.println("공통 기능"); }
default void methodA() { commonTask(); }
default void methodB() { commonTask(); }
}
8.8 다중 인터페이스 구현
- 하나의 클래스는 여러 인터페이스를 동시에 구현 가능.
class SmartTV implements RemoteControl, InternetSearch {
public void turnOn() {}
public void turnOff() {}
public void search(String url) {}
}
8.9 인터페이스 상속
interface A { void methodA(); }
interface B { void methodB(); }
interface C extends A, B {
void methodC();
}
class D implements C {
public void methodA() {}
public void methodB() {}
public void methodC() {}
}
8.10 타입 변환
- 자동 타입 변환 (Upcasting)
RemoteControl rc = new TV();
- 강제 타입 변환 (Downcasting)
RemoteControl rc = new TV();
TV tv = (TV) rc;
8.11 다형성
- 자동 타입 변환 + 메소드 오버라이딩 조합으로 다형성 구현.
- 필드/매개변수 다형성 모두 상속과 동일하게 적용.
void useRemote(RemoteControl rc) {
rc.turnOn();
}
useRemote(new TV());
useRemote(new Audio());
8.12 객체 타입 확인
instanceof로 타입 체크 후 안전하게 다운캐스팅 가능.
if (rc instanceof TV) {
TV tv = (TV) rc;
tv.setMute(true);
}
8.13 봉인된 인터페이스 (Sealed Interface, Java 15+)
- 무분별한 구현 방지.
permits 뒤에 올 수 있는 구현 클래스를 명시.
public sealed interface Shape permits Circle, Rectangle {}
public final class Circle implements Shape {}
public non-sealed class Rectangle implements Shape {}
P.S 핵심 요약:
interface로 선언, implements로 구현
- 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드, private 메소드 지원
- 다중 구현 & 다중 상속 가능
- 타입 변환, 다형성,
instanceof 활용은 상속과 동일
- Java 15+: sealed interface로 구현 제한 가능