본문 바로가기
정리/Java

Java - default 메서드

by 난파선 2017. 3. 13.


 자바8에서 새로 List에 sort(), Collection stream() 메서드가 추가 되었다. 해당 메서드가 추가 되면서 해당 인터페이스를 구현한 클래스에서 해당 메서드를 구현해야하는 문제가 발생, 그 문제를 해결 하기 위해 새로 생긴 문법


public interface AAA {
        void a();
        default void b() { // default 메서드 인터페이스 안에서 구현한다.
                        System.out.println("AAA");
        }
}
  • default 특징
    • 인터페이스 안에서 구현된다.
    • 해당 인터페이스를 구현하는 클래스에서는 오버라이딩 하지 않아도 된다.
    • 구현클래스에서 default 메서드를 오버라이딩 구현 했을 경우 해당 클래스의 메서드가 호출된다.
      • 클래스에서 구현한 메서드 -> 하위 인터페이스 -> 상위 인터페이스
    • 다이아몬드(C++) 충돌 시 명시적으로 오버라이딩 해주어야 한다.
public interface BBB extends AAA {
    @Override
    default void b() {
        System.out.println("BBB");
    }
}

public interface CCC extends AAA{}

public class DDD implements BBB, CCC {
    @Override
    public void a() {  // a 메서드는 구현해야 하지만 b 메서드는 구현하지 않아도 된다.
    }
}

public class MMM {
    public static void main(String[] args) {
        DDD d = new DDD();
        d.b();  // BBB 하위 인터페이스에서 구현한 메서드가 호출된다.
    }
}


다이아 몬드 충돌

public interface CCC extends AAA{
    default void b() {  // CCC에서 b메서드를 구현
        System.out.println("CCC");
    }
}
"Duplicate default methods named b with the parameters () and () are inherited from the types CCC and BBB"
public class DDD implements BBBCCC {
    @Override
    public void a() {
    }

    @Override
    public void b() //명시적으로 구현해주어야 한다.
        BBB.super.b();
    }
}


'정리 > Java' 카테고리의 다른 글

Java - collect(), Collector, Collectors  (0) 2017.03.11
Java - 메서드 레퍼런스(method reference)  (0) 2017.03.10
Java - Stream 최종 연산자(reduce)  (0) 2017.03.09
Java - Stream 최종 연산자  (0) 2017.03.08
Java - Optional  (0) 2017.03.07

댓글