Java 8에 도입된 dafault 메소드와 static 메소드

byeol·2023년 6월 7일
0

데브코스

목록 보기
2/2

안녕하세요.

Java 8은 람다 표현식, 함수형 인터페이스, method references, stream, Optional 그리고 인터페이스에 도입된 default, static 메서드를 포함한 새로운 변화를 가져왔습니다.

오늘은 인터페이스에 도입된 default, static 메서드에 대해
Baeldung과 데브코스 수업을 바탕으로 정리해보겠습니다.

default 메소드의 필요성

public interface MyInterface {
    
    // regular interface methods
    
    default void defaultMethod() {
        // default method implementation
    }
}

abstact 메서드는 모두 강제로 구현되어야 합니다.
만약 구현하지 않는다면 error가 발생하고
그래서 인터페이스의 모든 추상 메서드를 사용하지 않더라도Overrice하여 구현해야 합니다.

또한 인터페이스에 새로운 메서드가 생겼다면 이 인터페이스를 구현한 모든 클래스는 추가된 메서드에 대해서 강제로 Override해야합니다.

하지만 Java 8 이후 이 문제를 효율적으로 처리하는 방법인 default Method가 도입되었습니다. 구현 클래스에서는 이제 모두 강제로 구현할 필요성이 사라지게 되었습니다.

💎 다중 인터페이스 상속 (다이아몬드 문제)

인터페이스 VS. 인터페이스

인터페이스는 다중 상속이 가능하고 만약에 그 인터페이스 사이에서 동일한 Signature를 갖는 n개의 Default Method를 상속받는 상황이 발생할 수 있습니다.

그렇다면 누구의 메서드를 선택해야하는가?

  • 해결하기 위해서 아래와 같이 명시적으로 언급할 수 있습니다.
@Override
public String turnAlarmOn() {
    return Vehicle.super.turnAlarmOn();
}
  • Sub Inferface가 이깁니다.
    B라는 인터페이스가 A라는 인터페이스를 상속받는 상황이라면
    B가 이깁니다.

인터페이스 VS. 클래스

만약에 클래스와 인터페이스 사이에서 동일한 Signature를 갖는 메서드를 가지고 있다면 누구의 메서드를 선택해야할까요?

어떤 인터페이스가 오든 클래스가 이깁니다.

static 메소드

default 메서드 말고도 추가로 Java 8은 우리에게 static 메소드도 인터페이스에서 구현하고 실행하도록 허락했습니다.

static 메소드는 어떤 특정 객체에 포함되지 않기 때문에 그 인터페이스를 구현한 클래스의 API에도 소속되지 않습니다. 그래서 default 메소드를 사용하기 위해서는 인터페이스의 이름을 메소드 이름 앞에 명시해야 합니다.

public interface Vehicle {
    
    // regular / default interface methods
    
    static int getHorsePower(int rpm, int torque) {
        return (rpm * torque) / 5252;
    }
}
Vehicle.getHorsePower(2500, 480));

따라서 static 메서드의 도입은 객체를 만들지 않고도 관련 method들을 한 곳에 결합함으로써 설계의 응집력을 높일 수 있는 간단한 메커니즘을 제공하는 것입니다.

또한 static 메소드들을 놓기 위해서 utility classes를 만들지 않고 static 메소드가 있는 인터페이스를 만드는 것도 가능하게 되었습니다.

profile
꾸준하게 Ready, Set, Go!

0개의 댓글