모두 자바 interface에서 이용 가능한 default method를 아시나요?
최근에 알게된 default method에 대해서 작성해보려고 합니다.
이전까지 인터페이스를 구현하면 인터페이스를 구현할 클래스를 생성하고, 이 클래스 안에서 메서드를 오버라이드 해서 작성했었다.
그런데 만약 인터페이스를 사용하는 클래스가 100개가 있고, 인터페이스에 공통적으로 사용 가능한 메서드 하나를 추가했다고 해보자.
클래스 100개에 동일한 코드를 작성해야됨!!
모든 클래스에 열심히 복사, 붙여넣기를 통해 코드를 추가할 수 있겠지만, 대충 생각해봐도 이것은 너무나도 번거롭고 귀찮은 작업이 될 것 같다.
이를 해결하기 위한 방법이 바로 설명 드리는 default method이다.
default method는 인터페이스 안에서 작성 가능하고, 구현한 클래스에게 모두 동일하게 적용할 수 있다.
즉, 클래스 100개에 모든 코드를 복사하지 않고 인터페이스에서 default method를 통해 간단히 해결 가능하다!!
public interface MyInterface {
// 일반적인 인터페이스 활용 방법
void printMessage();
// 디폴트 메서드를 이용한 방법
default String getMessage() {
return "디폴트 메서드를 이용한 메시지입니다.";
}
}
public class Main implements MyInterface {
@Override
public void printMessage() {
System.out.println("일반적인 인터페이스 활용");
}
}
위와 같은 코드가 있을 때 실제로 Main 클래스에서 구현하지 않아도 MyInterface 안에 있는 getMessage() 메서드를 이용 가능하다는 것을 볼 수 있다.
또한 인터페이스에서 private method를 이용할 수 있다.
우리가 클래스를 작성했을 때 중복되는 기능을 효율적으로 관리하기 위한 방법이 무엇이 있을까?
여러가지가 있겠지만, 간단하게 메서드로 분리하는 방법을 생각할 수 있다.
이와 동일하게 인터페이스 안에서도 private method를 이용하여 중복을 제거할 수 있고, 당연하게 해당 인터페이스를 사용하는 클래스들은 private method를 사용할 수 없다.
// 예시 코드
public interface MyInterface {
void printMessage();
default String getMessage() {
return privateMethod();
}
default String getMessage(String input) {
return String.format("%s: %s", input, privateMethod());
}
// private method를 이용한 중복 제거
private String privateMethod() {
return "디폴트 메서드를 이용한 메시지입니다.";
}
}
정말 공부하다 보면 모르던 개념들을 너무나도 많이 알 수 있고, 잘 활용해봐야겠다는 생각이 드는 것 같다.
얼른 익숙해질 수 있길~