인터페이스를 구현하는 클래스에서는 메서드를 모두 구현해야하기 때문에 인터페이스에 메서드를 추가할때 문제가 발생한다. 메서드 하나를 추가하려면 해당 인터페이스를 구현하는 모든 클래스에서는 해당 메서드를 모두 구현해줘야 하는 것이다.
Java8에서는 이러한 문제를 해결하기 위해 2가지 방법을 제공한다.
1.인터페이스 내부에 정적 메서드(static method)를 사용한다.(인스턴스 생성하지 않고 사용 ex) Math.abs ..)
2.인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드(default method) 기능을 사용한다. 인터페이스에 default 메서드를 사용하여 메서드를 구현할 수 있다.
default 메서드를 이용하면 인터페이스의 기존 구현을 그대로 상속하므로 인터페이스에 자유롭게 새로운 메서드를 추가할 수 있게 된다. 이로인해 호환성을 유지하면서 API를 바꿀 수 있다.
default 메서드 도입 이전에는 인터페이스에 추상 메서드(로직 불가능)만 작성할 수 있었는데 Java 8 에서 부터는 default 메서드를 통해 인터페이스 내부에 로직이 포함된 메서드를 선언할 수 있다.
public interface InterfaceTest {
void test();
}
인터페이스 내부에 메서드 본문이 없는 추상 메서드가 존재하므로 정상적으로 컴파일된다.
public interface InterfaceTest {
void test() {
System.out.println("test");
};
}
추상 메서드에 메서드 본문이 존재하므로 컴파일 에러가 발생한다.
1) 디폴트 메서드 생성
// 예시 자바 Comparator 인터페이스에 존재하는 내림차순 정렬
public interface InterfaceTest {
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
}
인터페이스 클래스 내부에 default 메서드로 선언을 하고 위와 같이 내부 로직을 작성하여 컴파일한다.
2) 정리
자바 8 이전까지는 객체지향설계에 얽매인 코딩을 했다면 이후부턴 좀 더 유연한 코딩이 가능해졌다. 단순히 실용성을 넘어 OCP(개방-폐쇄의 원리)와도 연관성이 있기 때문에 더욱 합리적인 코딩 방법이라고 할 수 있겠다.
Reference : https://velog.io/@heoseungyeon/%EB%94%94%ED%8F%B4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9CDefault-Method
디폴트 메서드(Default Method)
java 8 이 등장하면서 인터페이스(Interface) 개념에 디폴트 메서드(default method)를 사용할 수 있게 되었습니다. 원래 기존의 인터페이스는 추상 메서드만 존재할 수 있었고 이를 상속받는 구현체에서
velog.io
'자바 > 개념' 카테고리의 다른 글
[Java] replaceAll 정규 표현식 사용방법 (0) | 2024.12.10 |
---|---|
[Java] 함수형 인터페이스(Functional Interface) 란? (0) | 2024.04.11 |
컴파일(compile)와 인터프리터(interpreter)는 무엇일까? (0) | 2024.04.04 |
JIT(JUST IN TIME) 란? (0) | 2024.04.04 |
Call by Value, Call by Reference 란? (0) | 2024.04.04 |