반응형
인터페이스의 디폴트 메서드
Java8에서 추가된 람다식을 제외하고도
편리한 기능이 추가되었다.
그 중 하나가 인터페이스의 default 메소드이다.
Java8에서는 interface에 default 키워드를 통해 메서드를 구현할 수 있다. 또, 이를 구현하는 클래스는interface의 메서드를 @Override 할 수 있다.
Default 매서드 구현 방법은 다음과 같다.
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 | // getName이라는 default 메소드 선언 public interface WedulInterface { default String getName() { return "wedul"; } } // getName이 없는 DTO 클래스 생성 public class WedulObject implements WedulInterface { private String name; public WedulObject(String name) { this.name = name; } public WedulObject() {} public void setName(String name) { this.name = name; } } // default 메소드에 적용되어있는 getName() 메소드 사용 public class Java8Test { public static void main(String args[]) { WedulObject object = new WedulObject(); System.out.println(object.getName()); } } | cs |
인터페이스 다중상속으로 인한 모호성 해결
인터페이스의 경우 다중 상속이 가능하다. 그렇기 때문에 default 메소드의 경우에도 다음과 같은 오류가 발생할 수 있다.
첫번째 오류 상황
didItwork라는 메소드를 제공하는 인터페이스 두 개를 모두 상속 받고 있을 경우
Java8은 다음과 같은 경고메시지를 통해 개발자에게 모호함을 없애라는 경고 문구를 통해 알려준다.
동일한 메소드를 인터페이스로 선언하였기 때문에 어떤 default 메소드를 사용할지 모호해진 상황
위와 같이 경우에 오류가 발생하는데, 이를 명시적으로 기재함으로써 모호성을 해결할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public interface OperateCar { default public int startEngine(EncryptedKey key) { // Implementation } } public interface FlyCar { default public int startEngine(EncryptedKey key) { // Implementation } } // 직접 어떤 인터페이스의 메소드를 사용할지 기재해줌으로 써 모호성 해결 public class FlyingCar implements OperateCar, FlyCar { public int startEngine(EncryptedKey key) { FlyCar.super.startEngine(key); OperateCar.super.startEngine(key); } } | cs |
기존의 두개의 인터페이스를 상속받을 때 동일한 메소드가 존재하게 되면 상속받은 클래스에서 메소드를 하나만 정의하게 되면 두개의 인터페이스 메소드가 동일하게 정의가 되었다.
default 메소드가 선언된 인터페이스
사용자 정보를 보관하는 DTO Person 클래스
클래스에서 getName() 메서드를 정의하고, 인터페이스에서 default 메서드를 정의 하였을 때
이 두개를 상속 하였을 때
무조건 Super클래스인 Person 클래스를 상속받게 된다.
두개의 getName()을 상속 받았지만 결국에는 부모 클래스인 Person의 getName()을 상속 받은 것을 확인할 수 있다.
디폴트 메소드 vs 추상클래스
-> 디폴트 메소드가 생기면서 추상클래스와 인터페이스의 다른점이 모냐라고 궁금증을 가질 수 있다.
차이점
인터페이스는 private 값을 가지지 못한다.(오직 public, abstract, default, static 상태만 가질 수 있다.)
인터페이스는 생성자를 가질 수 없지만 추상클래스는 생성자를 가질 수 있다.
디폴트 메소드 vs 추상클래스
-> 디폴트 메소드가 생기면서 추상클래스와 인터페이스의 다른점이 모냐라고 궁금증을 가질 수 있다.
차이점
인터페이스는 private 값을 가지지 못한다.(오직 public, abstract, default, static 상태만 가질 수 있다.)
인터페이스는 생성자를 가질 수 없지만 추상클래스는 생성자를 가질 수 있다.
반응형
'JAVA > Java 8' 카테고리의 다른 글
Java8 스트림(Stream) API (0) | 2018.05.31 |
---|---|
Java8 인터페이스의 정적 메소드 (0) | 2018.05.30 |
Java8 변수 유효 범위 (0) | 2018.05.30 |
Java8 생성자 레퍼런스 (0) | 2018.05.30 |
Java8 메서드 레퍼런스 (0) | 2018.05.30 |