언어, 프레임워크/Java

인터페이스 내부 요소

go_getter 2025. 3. 4. 15:23

인터페이스 특징

  • 객체 생성 불가 (생성자 없음)
  • 다중 구현 가능 (여러개의 인터페이스 구현 가능)
  • 기능(행동) 공유 목적

인터페이스 요소

추상 메서드 (abstract method)

  • 선언만 가능
  • 자동적으로 public abstract
interface Animal {
    void makeSound(); // public abstract 생략됨
}

 

기본 메서드 (default method)

  • 자바 8부터
  • 인터페이스에서 메서드 직접 구현 가능
  • 인터페이스를 구현한 모든 클래스가 이 메서드를 자동 상속 받음
  • 구현 클래스가 반드시 구현할 필요 없음 (선택적 오버라이딩 가능)
  • 오버라이딩할 경우, 모든 구현 클래스에서 메서드에 접근할 수 있어야 하기 때문에 반드시 접근 지정자를 public으로 지정해야 함
interface Animal {
    void makeSound(); 

    default void eat() {
        System.out.println("먹이를 먹습니다.");
    }
}

 

정적 메서드 (static method)

  • 자바 8부터
  • 인터페이스에서 메서드 직접 구현 가능
  • 인스턴스 없이 인터페이스 이름으로 바로 호출 가능
interface MathUtil {
    static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        int sum = MathUtil.add(5, 10); // 직접 호출 가능!
    }
}

 

 

private 메서드

  • 자바 9부터
  • 인터페이스 내부에서만 사용 (헬퍼 메서드를 만들 때 사용)
  • 기본(default) 메서드나 정적(static) 메서드에서만 호출 가능
interface MyInterface {
    // 기본(default) 메서드
    default void showMessage() {
        System.out.println("✅ 메시지 출력 중...");
        log("showMessage 실행됨!");
    }

    // 정적(static) 메서드
    static void showAlert() {
        System.out.println("⚠️ 경고 발생!");
        log("showAlert 실행됨!");
    }

    // 인터페이스 내부에서만 사용 가능한 private 메서드
    private static void log(String message) {
        System.out.println("[LOG]: " + message);
    }
}

public class Main {
    public static void main(String[] args) {
        MyInterface obj = new MyInterface() {}; // 익명 클래스 사용
        
        obj.showMessage(); // ✅ 메시지 출력 중... + [LOG]: showMessage 실행됨!

        MyInterface.showAlert(); // ⚠️ 경고 발생! + [LOG]: showAlert 실행됨!
    }
}

 

상수

 

  • 변수는 불가능
  • 자동적으로 public static final