공통 상수 값을 인터페이스에 정의하는 이유가 예전부터 궁금했었다.
처음에는 메소드가 필요 없어서 interface로 설계를 했나라고 그러려니 했었는데 다른 사람이 만들어놓은 소스를 보다보니 그 이유를 알게 되었다.
아래 코드는 다른 사람이 작성한 코드의 일부분이다.
public class MdnChangeServlet extends HttpServlet implements CodeDefinition {
CodeDefinition 인터페이스에는 static 상수 값이 정의되어 있고, MdnChangeServlet에서 상수 값을 사용하기 위해 인터페이스를 구현했다.
static으로 정의되어 있는 상수 값을 굳이 인터페이스 구현을 통해서 사용하려는 목적은 CodeDefinition.IS_CHECK 와 같이 코드를 작성하는 것보다 IS_CHECK 처럼 작성하는 편히 가독성이 더 좋기 때문일 것이다.
만약 CodeDefinition이 클래스로 정의되어 있다면?
HttpServlet을 상속하고 있는 MdnChangeServlet은 다중 상속으로 인하여 상속을 받을 수 없을 것이다.
이와 같은 다중 상속 문제로 인하여 상수를 정의한 객체를 인터페이스로 정의하고, 다중 인터페이스 구현이 가능한 이점을 살려 위와 같이 사용을 하는 것 같다.
하지만 위의 코드는 문제가 있다.
인터페이스는 공통되는 관심 사항을 추상화 시키는 목적하에 이를 각 클래스가 구현을 하도록 설계하는 것이 객체지향의 원리이다.
단지 공통 상수 값을 다른 클래스에서 가져다 쓰기 편하게 하기 위해서 위와 같이 코드를 작성하는 방법은 잘못된 설계라고 본다.
차라리 공통적인 상수 값을 한 곳으로 집중한 클래스를 설계하고, 다른 클래스에서 상수 값을 가져다가 쓸 때에는 static import를 사용하는 편이 좋을 것이다.
static import가 IDE에서 자동 완성이 되지 않지만 java > Editor > Content Assist > Favorites 메뉴에서 상수로 정의된 클래스를 New Type으로 등록한다면 자동 완성을 통해 편하게 static import를 이용할 수 있을 것이다.