"인터페이스는 클래스가 아니다!!"

ggyu_55·2023년 4월 3일
0

메모

목록 보기
9/46

추상 클래스

  • 공통 규약을 내리는 것이 목적인 추상 클래스

  • 최소 하나 이상의 추상 메서드를 가지는 클래스 :: 추상 메서드가 아닌 미리 구현된 메서드도 가질 수 있다!!

  • 직접 객체를 구현할 수 없다. 아직 정의되지 않은 메서드(=추상 메서드)도 존재하기 때문이다. 추상메서드가 구현이 되어야 인스턴스를 만들 수 있으니까.

  • 다중 상속이 불가능하다. 동일한 시그니쳐를 가진 두 부모 클래스를 상속받을 때, 해당 메서드가 이미 구현된 메서드라면 어떤 클래스의 메서드를 상속받아야하는지 파악할 수 없기 때문이다.


인터페이스

  • 보지 않고도 사용할 수 있게 하는 접점이 되어주는 것이 목적인 인터페이스

  • 상수 필드와 디폴트 메서드도 가질 수 있다.

  • 클래스가 여러개의 인터페이스를 동시에 구현할 수 있다. (다중 상속) 정의된 메서드가 존재하지 않기 때문에 동일 시그니쳐의 메서드를 얼마나 상속받던 상관이 없다. 어차피 해당 메서드들은 모두 아직 구현되지 않아 자식 클래스에서 새롭게 정의해야 하기 때문이다.

  • implements 키워드를 사용하여 구현한다.

Default 메서드

자바 8에서 인터페이스에 도입된 개념으로, 인터페이스 내에 메서드의 기본 구현을 제공할 수 있게 해준다. 이전에는 인터페이스 내에 추상 메서드만 정의할 수 있었지만, 디폴트 메서드를 사용하여 인터페이스에서 메서드의 기본 동작을 구현할 수 있다. 디폴트 메서드는 인터페이스의 구현 클래스에서 반드시 구현할 필요가 없고, 필요에 따라 오버라이드한다.

  • 인터페이스를 변경하지 않고 새로운 기능을 추가할 수 있다

  • 기존에 인터페이스를 구현한 클래스들에 영향을 주지 않고, 새로운 기능을 추가할 수 있다.

  • 인터페이스에 새 기능을 추가하면 이를 implement받은 클래스가 모두 새로운 기능을 구현해야했지만, 디폴트 메서드 덕에 수고를 덜 수 있다.

interface MyInterface {
    // default 키워드 사용
    default void defaultMethod() {
        // 기본 동작을 구현
        System.out.println("안녕하세요 디폴트 메서드 입니다.");
    }

    // 추상 메서드
    void abstractMethod();
}

그렇지만 그렇다면 다중상속을 가능하게 하는 인터페이스의 특징이 깨지게 되는 것이 아닌가? 여러 개의 인터페이스에서 같은 시그니쳐를 가지는 디폴트 메서드를 다중상속하게 되면?

찾아보니 이를 방지하기 위해서 상속 규칙이 마련되어 있었다.

  1. 상속받은 클래스에서 메소드를 재정의하면, 클래스내의 메소드가 우선권을 갖는다.

  2. sub 인터페이스의 디폴트 메서드가 실행된다. ( 현재 자식 클래스로부터 가장 가까운 부모클래스의 디폴트 메서드)

  3. 위의 규칙으로도 우선순위가 결정되지 않으면, 상속받는 클래스가 명시적으로 디폴트 메소드를 오버라이드하고 호출해야 한다.

함수형 인터페이스

자바 8부터 도입된 개념으로, 딱 하나의 추상 메서드를 가지는 인터페이스. @FunctionalInterface 어노테이션으로 명시할 수도 있다.


추상 클래스와 인터페이스가 공존하고 있는 이유 :: 목적에 맞게 달리 쓰기 위해서 >> 관점의 차이

추상 클래스와 인터페이스는 서로 보완적인 개념으로, 프로그램의 구조와 요구사항에 따라 적절하게 사용해야 한다.

추상 클래스와 인터페이스는 미리 구현된 메서드를 가지고 있느냐가 가장 큰 차이이다.

  • 추상 클래스는 공통된 기능을 가진 클래스들을 묶어서 공통 코드를 구현하는 데 유용하다.

  • 인터페이스는 클래스가 어떤 기능을 제공하는지를 정의하고, 해당 기능을 구현하는 다양한 클래스들을 만들 수 있도록 한다.


참고 :: 자바의 다중상속

0개의 댓글