BackEnd/Java

[Java] Default Methods(디폴트 메소드)

꾹꾹이 2022. 10. 20.
728x90

Default Method 란?

인터페이스는 기능에 대한 선언만 하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없다. 하지만 자바 8에서 이러한 규칙을 깨는 기능이 나왔다. 그것이 Default Method(디폴트 메소드)이다. 메소드 선언 시 default를 명시하게되면 인터페이스 내부에서도 로직이 포함된 메소드를 선언할 수 있다.

 

** 접근 제어자에서 사용하는 default와 키워드가 같다. 하지만 접근 제어자에선 아무 것도 명시하지 않아도 'default'라고하고, 인터페이스의 default method는 'default'라는 키워드를 명시해야 한다.

 

1
2
3
4
5
interface TestInterface {
    default void print() {
        System.out.println("Hello world");
    }
}
cs

 

Default Method 사용 이유

인터페이스는 기능에 대한 구현보다, 기능에 대한 '선언'에 초점을 맞추어 사용한다. 기존에 존재하던 인터페이스를 이용하여 구현된 클래스를 만들고 사용하고 있는데 인터페이스 보완 과정에서 추가적으로 구현해야 할 혹은 필수적으로 존재해야 할 메소드가 있다면, 이 인터페이스를 구현한 클래스와의 호환성이 떨어지게 된다. 이 경우에 default 메소드를 추가하면 하위 호환성은 유지되고 인터페이스의 보완을 진행할 수 있다.

 

예를 들어 내가 만든 오픈 소스 코드가 유명해져서 전 세계 사람이 다 사용하고 있다. 그러던 중에 인터페이스에 새로운 메소드를 만들어야 하는 상황이 발생했다. 내가 만든 오픈소스를 사용하는 모든 사람들은 전부 오류가 발생할 수 있고 수정해야 할 것이다. 이 때 사용하는 것이 바로 default method이다.

 

다음은 디폴트 메소드로 정의된 인터페이스를 Car 클래스가 implements 하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Vehicle {
    default void print(String str) {
        System.out.println("I want to " + str);
    }
}
 
class Car implements Vehicle {}
 
public static void main(String args[]) {
    Car car = new Car();
    car.print("Car");
}
//결과: I want to Car
cs

 

 

회고

자바 8 이전까지는 객체지향설계에 얽매인 코딩을 했다면 이후부턴 좀 더 유연한 코딩이 가능해졌다. 단순히 실용성을 넘어 OCP(개방-폐쇄의 원리)와도 연관성이 있기 때문에 더욱 합리적인 코딩 방법이라고 할 수 있겠다.

댓글