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 상태만 가질 수 있다.)

인터페이스는 생성자를 가질 수 없지만 추상클래스는 생성자를 가질 수 있다.

+ Recent posts