[Day 5| Java] 인터페이스

y♡ding·2024년 10월 18일
0

데브코스 TIL

목록 보기
25/163

📌 인터페이스와 디폴트 메서드

💡 인터페이스(Interface) 개념

인터페이스는 자바에서 추상 메서드(구현이 없는 메서드)와 상수만을 가지는 특별한 클래스이다. 인터페이스는 객체 지향 프로그래밍에서 다형성을 극대화하고, 구현 클래스들이 동일한 동작을 수행하도록 강제하는 역할을 한다.

  • 모든 메서드는 기본적으로 publicabstract로 정의된다.
  • 모든 필드는 public static final 상수로 선언되며, 값이 변경되지 않는다.
  • 인터페이스는 객체를 직접 생성할 수 없고, implements 키워드를 통해 구현 클래스에서 구현된다.
  • 다중 구현이 가능하여, 한 클래스가 여러 인터페이스를 동시에 구현할 수 있다.

기본 구조

public interface 인터페이스명 {
    // 상수 선언
    타입 상수명 =;

    // 추상 메서드 선언
    타입 메서드명(매개변수);
    
    // 디폴트 메서드 (선택적)
    default 타입 메서드명(매개변수) {
        // 기본 구현
    }
    
    // 정적 메서드 (선택적)
    static 타입 메서드명(매개변수) {
        // 구현
    }
}

🤞🏻 특징

  • 강제성: 인터페이스를 구현하는 클래스는 모든 추상 메서드를 반드시 오버라이딩하여 구현해야 한다.
  • 다형성: 인터페이스는 다형성을 통해 객체의 유연성을 높이고, 유지보수성을 강화한다.
  • 다중 구현: 자바는 클래스의 다중 상속을 지원하지 않지만, 인터페이스는 다중 구현을 지원하여 하나의 클래스가 여러 인터페이스를 구현할 수 있다.

예시 코드

interface InterA {
    // 상수 선언
    public static final String STR1 = "홍길동";
    String STR2 = "박문수";  // public static final 생략 가능

    // 추상 메서드 선언
    void methodA();  // public abstract 생략 가능
    void methodB();  // 생략 가능
}

abstract class ClassA implements InterA {
    public void methodA() {
        System.out.println("methodA 호출");
    }
}

class ClassAA extends ClassA {
    public void methodB() {
        System.out.println("methodB 호출");
    }
}

public class InterfaceMainEx01 {
    public static void main(String[] args) {
        ClassAA aa = new ClassAA();
        aa.methodA();  // "methodA 호출"
        aa.methodB();  // "methodB 호출"
    }
}

📌 디폴트 메서드(Default Method)

💡 디폴트 메서드란?

기본 구현을 제공하는 메서드로, 인터페이스를 구현하는 클래스에서 선택적으로 오버라이딩할 수 있다. 즉, 기본적으로는 인터페이스에서 제공된 구현을 사용하되, 필요에 따라 구현 클래스에서 변경할 수 있다.

🤞🏻 특징

  • 기존 코드와의 호환성: 추상 메서드로 메서드를 추가하면 모든 구현 클래스가 이를 오버라이딩해야 하지만, 디폴트 메서드를 사용하면 기존 클래스들은 그대로 유지할 수 있다. 즉, 이미 운영 중인 시스템에서 새로운 기능을 추가하면서도 기존 구현 클래스에 영향을 주지 않고 새로운 메서드를 추가할 수 있다.
  • 유연한 설계: 인터페이스에서 일반적인 구현을 제공하면서도, 필요에 따라 구현 클래스가 해당 메서드를 오버라이딩하여 수정할 수 있다.

예시 코드

interface InterA {
    void methodA();
    
    // 디폴트 메서드
    default void methodB() {
        System.out.println("methodB 호출");
    }
}

class ClassA implements InterA {
    public void methodA() {
        System.out.println("methodA 호출");
    }
}

public class InterfaceMainEx05 {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        a.methodA();  // "methodA 호출"
        a.methodB();  // "methodB 호출" (기본 구현 사용)
    }
}
interface InterA {
    void method1();

    // 디폴트 메서드
    default void method2() {
        System.out.println("method2 호출");
    }
}

class ClassA implements InterA {
    public void method1() {
        System.out.println("ClassA method1 호출");
    }

    // 디폴트 메서드 오버라이딩
    public void method2() {
        System.out.println("ClassA method2 오버라이딩 호출");
    }
}

class ClassB implements InterA {
    public void method1() {
        System.out.println("ClassB method1 호출");
    }
}

public class InterfaceMainEx06 {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        ClassB b = new ClassB();

        a.method1();  // "ClassA method1 호출"
        a.method2();  // "ClassA method2 오버라이딩 호출"
        
        b.method1();  // "ClassB method1 호출"
        b.method2();  // "method2 호출" (기본 구현 사용)
    }
}

🥊 인터페이스 vs 추상 클래스

특징인터페이스(Interface)추상 클래스(Abstract Class)
메서드 구현 여부모든 메서드는 기본적으로 구현이 없음
(단, Java 8 이후 default 메서드 가능)
일부 메서드는 구현될 수 있음
다중 상속 여부여러 인터페이스를 동시에 구현 가능단일 클래스만 상속 가능
필드상수만 선언 가능 (public static final 자동 적용)인스턴스 필드상수 선언 가능
목적클래스 간 공통된 행위 규약 정의클래스 간의 공통된 동작과 상태 정의

0개의 댓글

관련 채용 정보