자바가 제공하는 다중 궇녀 메커니즘은 인터페이스와 추상클래스 이렇게 두가지다.
추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 새로운 타입을 정의하는데 커다란 제약을 안게 되는 셈이다.
반면 인터페이스가 선언한 메서드를 모두 정의하고 그 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다.
기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다.
기존 클래스에 새로운 인터페이스를 구현하려면, 간단하게 해당 인터페이스를 클래스 선언문에 implements 구문으로 추가하고 인터페이스가 제공하는 메소드들을 구현하기만 하면 끝이다.
반면에 기존 클래스에 새로운 추상 클래스를 상속하기에는 어려움이 따른다. 두 클래스가 같은 추상 클래스를 상속하길 원한다면 계층적으로 두 클래스는 공통인 조상을 가지게 된다. 만약 두 클래스가 어떠한 연관도 없는 클래스라면 클래스 계층에 혼란을 줄 수 있다.
인터페이스는 믹스인 정의에 안성맞춤이다.
믹스인이란 어떤 클래스의 주 기능에 추가적인 기능을 혼합한다 하여서 믹스인이라고 한다. 그러므로 믹스인 인터페이스는 어떤 클래스의 주 기능이외에 믹스인 인터페이스의 기능을 추가적으로 제공하게 해주는 효과를 준다.
추상 클래스가 믹스인 정의에 맞지않은 이유는 기존 클래스에 덧씌울 수 없기 때문이다. 자바는 단일 상속을 지원하기 때문에 한 클래스가 두 부모를 가질 수 없고 부모와 자식이라는 클래스 계층에서 믹스인이 들어갈 합리적인 위치가 없다.
믹스인 인터페이스엔 대표적으로 Comparable, Cloneable, Serializable 이 존재한다.
인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다.
현실의 개념 중에는 동물과 포유류, 파충류, 조류 와 같이 타입을 계층적으로 정의하여 구조적으로 잘 표현할 수 있는 개념이 있는가 하면 가수와 작곡가, 그리고 가수겸 작곡가(SingerSongWriter) 같이 계층적으로 표현하기 어려운 개념이 존재한다.
이런 계층구조가 없는 개념들은 인터페이스로 만들기 편하다.
가수, 작곡가 인터페이스가 존재한다. 또한 가수겸 작곡가도 존재한다. 가수와 작곡가를 인터페이스로 정의하였으니 사람이라는 클래스가 두 인터페이스를 구현해도 전혀 문제가 되지 않는다.
하지만 추상클래스로 만든다면 inger 클래스와 SongWriter 클래스를 둘다 상속할 수 없어 SIngerSongWriter라는 또 다른 추상 클래스를 만들어서 클래스 계층을 표현할 수 밖에 없다. 만약 이런 Singer 와 SongWriter와 같은 속성들이 많이 있다면, 그러한 클래스 계층구조를 만들기 위해 많은 조합이 필요하고 결국엔 고도비만 계층구조가 만들어질 것이다. 이러한 현상을 조합 폭발이라고 한다.
래퍼 클래스 관용구(아이템 18)와 함께 사용하면 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다.
타입을 추상클래스로 정의해두면 그 타입에 기능을 추가하는 방법은 상속뿐이다. 상속해서 만든 클래스는 래퍼 클래스보다 활용도가 떨어지고 깨지기는 쉽다.
인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 있다.
인터페이스로는 타입을, 골격 구현 클래스로 나머지 메서드를 구현한다. 이것이 바로 템플릿 메서드 패턴이다.
다음은 골격 구현을 활용해 만든 구체 클래스이다.
오토박싱이란 래퍼(Wrapper) 클래스의 객체로 변환하는 것을 말한다.
여기서 래퍼클래스란 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있는데 기본 타입의 데이터를 그대로 사용할수는 없고 데이터를 객체로 변환해야 하는데 해당하는 데이터들을 객체로 포장해주는 것을 말한다. 자바스크립트에도 있는 개념이다.
구조상 골격구현을 확장하는 못하는 처지라면 인터페이스의 디폴트 메서드의 이점을 통해 직접 구현해야 한다.
골격 구현 클래스의 구현 보고 싶다면 다음 주소로 들어가 확인해 보면 된다.
https://dzone.com/articles/favour-skeletal-interface-in-java