[Java] Chapter 8. 인터페이스

SeungWoo Cha·2025년 9월 9일

Chapter 8. 인터페이스

8.1 인터페이스 역할

  • 객체 간의 책임 분리간접적 협력을 가능하게 한다.
  • 변경에 따른 영향 최소화.
  • 다형성 구현의 핵심 기술 (상속보다 더 자주 사용).

8.2 인터페이스와 구현 클래스 선언

  1. 인터페이스 선언
public interface RemoteControl {
    void turnOn();
    void turnOff();
}
  1. 구현 클래스 선언
public class TV implements RemoteControl {
    @Override
    public void turnOn() { System.out.println("TV ON"); }
    @Override
    public void turnOff() { System.out.println("TV OFF"); }
}
  1. 변수 선언과 객체 대입
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);  // public abstract 자동 적용
}

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 메소드

  • 인터페이스 내부에서 공용 기능 분리 용도로 사용.
  1. private 인스턴스 메소드 → 디폴트 메소드에서 호출 가능.
  2. 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 타입 변환

  1. 자동 타입 변환 (Upcasting)
RemoteControl rc = new TV(); // 자동 변환
  1. 강제 타입 변환 (Downcasting)
RemoteControl rc = new TV();
TV tv = (TV) rc;  // 캐스팅 필요

8.11 다형성

  • 자동 타입 변환 + 메소드 오버라이딩 조합으로 다형성 구현.
  • 필드/매개변수 다형성 모두 상속과 동일하게 적용.
void useRemote(RemoteControl rc) {
    rc.turnOn();
}

useRemote(new TV());     // TV 기능 동작
useRemote(new Audio());  // 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로 구현 제한 가능
profile
한 발자국씩

0개의 댓글