자바가 제공하는 다중 구현 메커니즘으로 인터페이스와 추상 클래스가 있다. 자바 8 부터는 인터페이스도 디폴트 메소드를 제공할 수 있게 되어 두 메커니즘 모두 인스턴스 메소드를 구현 형태로 제공할 수 있다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다.
인터페이스의 장점
인터페이스는 믹스인 정의에 안성맞춤이다. 믹스인이란 클래스가 구현할 수 있는 타입으로 믹스인을 구현한 클래스에 원래 주된 타입 외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 준다. 예를 들어 Comparable은 자신을 구현한 클래스의 인스턴스들끼리는 순서를 정할 수 있다고 선언하는 믹스인 인터페이스다. 자바는 다중상속이 안되기 때문에 추상 클래스로는 믹스인을 정의할 수 없다.
인터페이스는 계층구조가 없는 타입 프레임워크를 만들 수 있다. 타입을 계층적으로 정의하면 수많은 개념을 구조적으로 잘 표현할 수 있지만, 현실에서는 계층을 엄격히 구분하기 어려운 개념도 있다.
1 2 3 4 5 6 7 8 9 10 11 12
publicinterfaceSinger { AudioClip sing(Song s); }
publicinterfaceSongwriter { Song compose(int chartPosition); }
publicinterfaceSimpleCalculator { intplus(int num1, int num2); intminus(int num1, int num2); intdivision(int num1, int num2); intsimplePow(int x); voiddoCalculate(int num1, int num2);
//divide & conquer pow를 default로 제공 defaultintpow(int x, int n) { return n == 1 ? x : (n & 1) == 1 ? pow(x, n - 1) * n : simplePow(pow(x, n>>1)); } }