추상클래스말고 인터페이스를 사용하라는데 이유가 뭔가요?

조회수 7858회

예전에 수업을 들을때 교수님이 웬만하면 추상클래스말고 인터페이스를 사용하세요. 하고 부가적인 설명도 안해주시고 바로 다음 장으로 넘어갔는데 이번에 자바로 프로그래밍을 하게되면서 상속할 일이 생기니까 갑자기 그 이야기가 떠올랐습니다. 왜인지 아시는분 계신가요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    이펙티브 자바를 보면 18장에 추상클래스보다는 인터페이스를 사용하자 라는 내용이있습니다.

    일단 인터페이스와 추상클래스의 두드러진 차이는 추상클래스는 구현된 메소드를 포함할수있고 인터페이스는 그렇지 못하다는 것입니다. 또 다른 차이는 추상클래스로 정의된 타입을 구현하는 클래스는 반드시 추상클래스의 하위 클래스가 되야한다는 것입니다. 이와 달리 인터페이스를 구현하는 클래스의 경우는, 인터페이스에 정의된 모든 메소드를 구현하고 인터페이스 구현 계약을 지키면 됩니다. 이건 클래스 상속과는 무관합니다. 자바에서 클래스 간의 상속은 단일 상속만을 허용하기때문에 추상 클래스로 타입을 정의할때는 심한 제약이 따릅니다.

    기존 클래스들은 새로운 인터페이스를 구현하기 위해 쉽게 변경 될 수 있습니다. 인터페이스에 선언된 모든 메소드가 클래스에 구현되지 않았으면 추가하고 클래스 선언부에 implements 절을 추가하면 된다. 예를들어 Comparable 인터페이스가 자바 플랫폼에 추가 되었을 때 이 인터페이스를 구현하도록 기존 클래스들이 변경되었다. 그러나 일반적으로 새로운 추상 클래스를 상속받기 위해 기존 클래스를 개조할 수는 없다.

    만일 두 개의 클래스가 같은 추상 클래스에서 상속 받고자 한다면 타입 계층(클래스 상속 구조인)에서 그 추상 클래스를 한 단계 위로 올려서 두 클래스의 조상 클래스가 되도록 해야한다. 불행하게도 이것은 타입 계층에 큰 손상을 주게 된다. 좋든 싫든 모든 후손 클래스들( 두 클래스의 모든 서브 클래스를 포함해서)이 새로운 추상 클래스로부터 상속받아야 하기 때문이다.(그렇게 하는것이 적합한지를 불문하고)

    인터페이스는 믹스인(mixin)을 정의하는데 이상적이다. 믹스인은 클래스가 자신의 "본래타입"에 추가하여 구현할 수 있는 타입으로써, 선택 가능한 기능을 제공하며, 그 기능을 제공 받고자 하는 클래스에서 선언하낟. 예를 들어, Comparable은 믹스인 인터페이스로써, 상호 비교 가능한 다른 객체와의 비교를 통해 클래스의 인스턴스가 정렬된다는 것을 그 클래스에서 선언 할 수 있다. 그런 인터페이스를 믹스인이라고 부르는 이유는, 어떤 타입의 본래 기능에 선택 가능한 기능을 "섞는(mixed in)"것이 가능하기 때문이다. 기존 클래스가 추상 클래스로부터 상속받기 위해 개조될 수 없는 것과 같은 이유로, 추상클래스는 믹스인을 정의하는데 사용될 수 없다. 즉, 클래스는 하나 이상의 수퍼 클래스를 가질 수 없으므로, 클래스 상속 계층에 믹스인을 끼워 넣을 만한 마땅한 곳이 없기 때문이다.

    예를 들어 현실에서는 가수 겸 작곡가인 경우도 있는데 이런 경우를 인터페이스로 구현할경우 쉽게 구현가능하다.

    public interface Singer{
        AudioClip sing(Song s);
    }
    
    public interface Songwriter{
        Song compose(boolean hit);
    }
    
    public interface SingerSongwriter extends Singer,Songwriter{
        AudioClip strum();
        void actSensitive();
    }
    
    

    이러한 유연함이 항상 필요한 건 아니지만 정말 필요하다면 인터페이스가 답이될것입니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)