JaeniWorld
[Java] 디폴트 메소드(Default methods) 본문
디폴트메소드(Default methods)
Java 8 이전 인터페이스는 메소드만 정의할 수 있고 내용은 구현할 수 없었다. 하지만 Java 8부터는 디폴트메소드(Default methods) 기능이 추가되면서 default를 추가하면 구현 내용을 추가할 수 있도록 변화하였다. 또한 다중상속 동작이라는 유연성을 제공해 하나의 클래스에 여러 디폴트 메소드를 상속받을 수 있게 되었다.
디폴트메소드가 쓰이는 시점
디폴트메소드는 주로 기존 공개된 API의 변경이 필요할 때이다. 이전에는 디폴트메소드가 없었기 때문에 인터페이스에 새기능을 추가하면 이를 implement받은 클래스가 모두 새로운 기능을 구현해야했는다. 하지만, 이렇게 되면 호환성 문제가 생기기 때문에 인터페이스 자체에서 기본으로 기능을 구현하여 제공하는 것이다.
디폴트 메소드 활용
1. 선택형 메소드(optional method)
기존 인터페이스에서 잘 사용하지 않던 메소드를 디폴트 메소드로 작성하여 인터페이스를 implement하는 클래스에서 빈 메소드로 구현되지 않도록 한다.
2. 동작 다중 상속(multiple inheritance of behavior)
기존의 인터페이스는 다중 implement가 가능했지만, 메소드의 시그니처만 상속받을 수 있는 행태였다. 하지만 디폴트 메소드가 생기면서 동작을 추가한 메소드를 상속받을 수 있기 때문에 동작 다중 상속이 가능해지게 되었다.
동작 다중 상속 규칙
여러 개의 인터페이스를 implement하다보면, 같은 시그니처를 갖는 디폴트 메소드를 상속받는 경우가 생길 수 있다. 이때는 상속 규칙에 따라 메소드가 작동한다.
1. 상속받은 클래스에서 메소드를 재정의하면, 클래스내의 메소드가 우선권을 갖는다.
public interface Animal{
default void run(){
System.out.println("Animal Run");
}
public interface Human{
default void run(){
System.out.println("Human Run");
}
public Class Baby implements Animal,Human{
@Override
public void run() {
System.out.println("Baby crawl");
}
}
//출력
//Baby crawl
2. Sub interface의 디폴트 메소드가 실행된다.
public interface Animal{
default void run(){
System.out.println("Animal Run");
}
public interface Human implements Animal{
default void run(){
System.out.println("Human Run");
}
public Class Baby implements Human{
Baby.run();
}
//출력
//Human Run
3. 위의 규칙으로도 우선순위가 결정되지 않으면, 상속받는 클래스가 명시적으로 디폴트 메소드를 오버라이드하고 호출해야 한다.
public interface Animal{
default void run(){
System.out.println("Animal Run");
}
public interface Human{
default void run(){
System.out.println("Human Run");
}
public Class Baby implements Animal,Human{
@Override
public void run() {
Animal.super.run();
}
}
//출력
//Animal Run
참고
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java 8] 동작 파라미터화 (behavior Parameterization) (0) | 2021.01.18 |
---|---|
[Java] Java 8에 추가된 API (0) | 2021.01.12 |
[Java] Collection factory (0) | 2021.01.12 |
[Java] Stream 데이터 수집 (0) | 2021.01.11 |
[Java] Stream 연산 (0) | 2021.01.11 |