티스토리 뷰

JAVA

추상 클래스 보다는 인터페이스

세댕댕이 2022. 7. 24. 17:14

* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다.

 

18. 추상 클래스 대신 인터페이스를 사용하라

자바에는 여러가지 구현을 허용하는 자료형을 만드는 두 가지 방법이 있다. 바로 인터페이스추상 클래스

추상 클래스(abstract class)는 구현된 메서드를 포함할 수 있지만 인터페이스는 그럴 수 없다.

* 자바 1.8부터 인터페이스도 default / static 메서드를 통해 미리 메서드를 구현해둘 수 있게 되었다.

(default 메서드는 재정의가 가능하고, static 메서드는 재정의가 불가능하다.) 

 

 

인터페이스는 인터페이스에 포함된 모든 메서드를 정의하고 인터페이스가 규정하는 일반 규약을 지키기만 하면 되고, 또한 인터페이스를 통한 다중 상속도 가능하다. 

반면 추상 클래스가 규정하는 자료형을 구현하기 위해서는 반드시 추상 클래스를 계승(상속, extends)해야 한다. 또한 다중 상속을 허용하지 않기 때문에 많은 제약이 발생하게 된다.

 

 

1. 인터페이스는 믹스인(mixin)을 정의하는데 이상적이다. 믹스인이란, 클래스가 주 자료형 외에 추가로 구현할 수 있는 자료형으로 어떤 선택적 기능을 제공한다는 사실을 선언하기 위해 쓰인다.

- 대표적으로 Comparable 인터페이스가 있는데, 이는 어떤 클래스가 자기 객체는 다른 객체와의 비교 결과에 따른 순서를 갖는다고 선언할때 사용되는 믹스인 인터페이스이다. 비교 및 순서를 갖는다는 선택적 기능.

-> 원래 주된 기능에 더해 선택적인 기능을 혼합할수 있도록 해준다. (선택적 기능이 가능함을 나타내기에 -able로 끝나는 인터페이스가 많다)

= HAS-A 관계에 적합

 

반면 추상 클래스는 믹스인 정의에는 사용할 수 없다. 클래스가 상속할 수 있는 상위 클래스는 단 하나 뿐이고 클래스 계층에는 믹스인을 넣기 좋은 곳이 없다.

= IS-A 관계에 적합

 

 

2. 인터페이스는 비 계층적인 자료형 프레임워크를 만들 수 있도록 해준다. 매우 유연한 설계가 가능.

public interface Singer { AudioClip sing(Song s); }

public interface SongWriter { Song compose(boolean hit); }

public interface SingerSongWriter extends Singer, SongWriter {
    AudioClip strum();
    void actSensitive();
}

////

public class Artist implements SingerSongWriter {
    @Override public AudioClip strum() { ... }
    @Override public void actSensitive() { ... }
    @Override public AudioClip sing(Song s) { ... }
    @Override public Song compose(boolean hit) { ... }
}

 

3. 인터페이스를 사용하면 포장 클래스(데코레이터 패턴 등..)를 통해 안전하면서도 강력한 기능 개선이 가능하다

- 추상 클래스를 사용하면 상속 이외에는 사용할 수 있는 수단이 없다.

 

 

인터페이스에 비해 추상 클래스의 장점이 있다면, 바로 발전시키기 쉽다는 것이다. 다음 릴리스에 새로운 메서드를 추가하고 싶다면 적당한 기본 구현 코드를 담은 메서드를 언제든지 추가할 수 있다. 해당 추상 클래스를 구현하는 클래스들은 그 즉시 새로운 메서드를 사용할 수 있다.

기존 인터페이스는 이러한 점이 불가했는데 자바 1.8부터는 인터페이스도 default / static 메서드로 기존 클래스를 깨뜨리지 않고도 메서드 추가가 가능해져 이러한 단점이 사라지게 되었다

 

 

단 인터페이스 설계는 아주 신중하게 해야한다. 한번 만들어지고 사용되기 시작한 인터페이스는 나중에 수정하기가 매우매우매우매우매우매우매우 까다롭다. 처음부터 제대로 설계해야 하고, 테스트도 많이 거쳐봐야 한다.

 

 

(결론)

인터페이스는 기본 설계도와 같다. 구현 객체가 같은 동작을 수행하는 것을 보장하도록 해준다. (HAS-A)

추상 클래스는 미완성 설계도와 같다. 상속을 통해 부모의 기능을 확장하고자 할 때 사용한다. (IS-A)

 

 

(참고) https://myjamong.tistory.com/150

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함