Default Method?
JAVA8 에서는 Interface에 Default 키워드를 통해 메소드를 구현할 수 있다. 또 이를 구현하는 클래스는 Interface의 메소드를 @Override 할 수 있다.
아래는 Default 메소드를 구현한 소스이다.
// 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());
}
}
인터페이스의 다중 상속으로 인한 모호성 문제
인터페이스의 경우 다중상속이 가능하다. 그렇기 때문에 아래와 같은 소스에서는 모호성에 의한 오류가 발생될 수 있다.
case1.
public interface DefaultMethod {
default boolean OxQuestion (int i, double x, String s){
return false;
}
}
case2.
public interface named{
default boolean OxQuestion(int i, double x, String s){
return false;
}
}
OxQuestion 이라는 메소드를 제공하는 인터페이스 두개를 모두 상속 받았을 경우 JAVA8은 모호함에 대한 경고 메세지를 통해 개발자에게 알려준다.
이럴 경우 아래와 같이 명시함으로써 모호성을 해결할 수 있다.
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);
}
}
디폴트 메소드 vs 추상클래스
인터페이스는 private 값을 가지지 못한다.(오직 public, abstract, default, static 상태만 가질 수 있다.)
인터페이스는 생성자를 가질 수 없지만 추상클래스는 생성자를 가질 수 있다.
'Backend > JAVA' 카테고리의 다른 글
[JAVA] Optional (옵셔널) (0) | 2022.07.19 |
---|---|
[JAVA] Stream (스트림) (0) | 2022.06.20 |
[JAVA] Functional Interface (함수형 인터페이스) (0) | 2022.05.03 |
[JAVA] Lambda Expression(람다 표현식) (0) | 2022.01.27 |
[JAVA] JAVA 8 의 주요 변경사항 (0) | 2022.01.27 |