본문 바로가기
프로그래밍

공통 상수를 인터페이스에 정의하는 이유는 뭘까?

by 탁구치는 개발자 2013. 1. 29.

공통 상수 값을 인터페이스에 정의하는 이유가 예전부터 궁금했었다.

처음에는 메소드가 필요 없어서 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를 이용할 수 있을 것이다.