본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 추상 클래스보다는 인터페이스를 사용하자.

by 돼지왕 왕돼지 2016. 11. 7.
반응형

 [Effective Java] 추상 클래스보다는 인터페이스를 사용하자.


abstract class, API, Effective JAVA, IMPLEMENTATION, Interface, mixin, mixin interface, public interface, simple implementation, skeletal, skeletal implementation abstract class, test, [Effective Java] 추상 클래스보다는 인터페이스를 사용하자., 간단, 강력, 골격 구현, 골격 구현 추상 클래스, 골격 구현 클래스, 구현, 구현체, 규정, 능력, 단순 구현, 단순 구현 클래스, 단일 상속, 문서화 지침, 믹스인, 배포, 변경, 불가능, 비계층적 타입, 상속, 상속에 대한 규정, 설계, 안전, 연관, 유연성, 인터페이스, 적용, 정의, 진화, 진화 용이성, 추상 클래스, 타입, 테스트, 프로그래머


-
인터페이스(interface)와 추상클래스(abstract class)는 비슷하지만 다르다.
추상 클래스는 구현된 메소드를 포함할 수 있는 반면 인터페이스는 그렇지 못하다.
추상 클래스로 정의된 타입을 구현하는 클래스는 반드시 추상 클래스의 서브 클래스가 되어야 한다.
인터페이스를 구현하는 클래스의 경우 인터페이스에 정의된 모든 메소드를 구현하기만 하면 된다.
자바는 단일 상속만을 허용하므로 추상 클래스로 타입을 정의할 때 심한 제약이 따른다.


-
인터페이스는 추상 클래스에 비해 변경과 적용이 쉽다.


-
인터페이스는 믹스인(mixin)을 정의하는 데 이상적이다.
믹스인은 클래스가 자신의 본래 타입에 추가하여 구현할 수 있는 타입으로 선택 가능한 기능을 제공한다.


-
인터페이스는 비계층적인 타입 프레임워크를 구축할 수 있게 해준다.
예를 들어 Singer interface 와 SongWriter interface 가 있다면
interface SingerSongWriter extends Singer, SongWriter 를 만들 수 있다.


-
인터페이스는 안전하고 강력한 기능 향상을 가능하게 해준다.
interface 는 외부에 공개한 각각의 중요한 인터페이스와 연관시킨 골격 구현(skeletal implementation) 추상 클래스를 제공하여 인터페이스와 추상 클래스의 장점을 결합할 수 있다.
골격 구현 클래스 설계를 잘 하면, 그 클래스와 연관된 인터페이스를 프로그래머가 매우 쉽게 구현할 수 있다.


-
골격 구현 클래스의 작성은 비교적 간단하다.
대상이 되는 인터페이스를 파악하고, 구현할 메소드와 그대로 둘 메소드를 결정한다.
그대로 둘 메소드가 골격 구현 클래스의 추상(abstract) 메소드가 된다.
구현할 메소드들은 구현하면 된다.
골격 구현 클래스는 상속을 위해 설계되었으므로, 상속에 대한 규정( 설계와 문서화 지침 ) 을 모두 지켜야 한다.


-
골격 구현 클래스의 변이로 단순 구현(simple implementation)클래스가 있다.
인터페이스를 구현하고 상속을 위해 설계되었다는 점에서 골격 구현 클래스와 비슷하다.
단순 구현 클래스는 추상 클래스가 아니다.
가장 간단하게 동작 가능한 구현 클래스다.
상황에 따라 그대로 사용하거나 또는 서브 클래스를 만들어 사용할 수 있다.


-
추상 클래스를 사용하면 인터페이스를 사용할 때에 비해 추상 클래스를 진화시키는 게 훨씬 더 쉽다는 장점은 있다.


-
public interface 는 신중하게 설계해야 한다.
일단 인터페이스가 배포되어 널리 사용되면 변경이 거의 불가능하다.
처음부터 올바르게 만들어야 한다.



Summary


인터페이스는 많은 구현체(주로 클래스)에서 구현하는 타입을 정의하는 가장 좋은 방법이다.
그러나 유연성과 능력보다 진화의 용이성이 더 중요하게 고려되는 경우는 예외이다.
그런 경우라면 추상 클래스를 사용해서 타입을 정의해야 한다.
단, 추상 클래스의 제약 내역을 잘 이해하고 수용할 수 있을 경우에 한해서이다.
중요한 인터페이스를 API 에 공개한다면, 그것과 연관되는 골격 구현 클래스의 제공을 적극적으로 고려해야 한다.
모든 public 인터페이스는 매우 신중하게 설계해야 하며, 그 인터페이스를 구현하는 클래스를 많이 작성하여 철저하게 테스트해야 한다.





반응형

댓글