상수 인터페이스 패턴

연어는결국강으로·2023년 10월 8일
0

자바 공부

목록 보기
4/6

내가 아는 상수를 정의하는 방법은 세 가지가 있는데 enum, interface, 클래스 내부에 static final 필드로 정의하는 것이 그것이다.

그 중에서 interface는 내가 초반에 강의를 들을 때 했던 방식으로 매번 클래스에 static final에 정의하는 것보다 재사용성이 좋아보여서 이렇게 하면 좋구나 하고 생각했던 것이었다. 하지만 interface에 상수를 정의하는 것은 요즘에는 거의 하지 않는다고 한다. 이유는 아래와 같다.

1. 디자인 관점

인터페이스는 타입 정의를 위한 것이어야 한다. 상수만을 포함하는 인터페이스는 "상수 인터페이스 패턴"이라고도 불리며, 이는 객체 지향 디자인 원칙에 위배된다.

그렇다면 어떻게 객체 지향 원칙에 위배되는 것인가?

  1. 인터페이스의 적절한 사용: 객체 지향 프로그래밍에서 인터페이스는 구현과 계약을 분리하는 데 사용된다. 인터페이스는 특정 행동을 정의하고, 이를 구현하는 클래스는 해당 행동을 수행해야 한다. 상수만을 담고 있는 인터페이스는 이 원칙을 따르지 않는다.

  2. ISP (Interface Segregation Principle): SOLID 원칙 중 하나인 ISP는 "클라이언트는 자신이 사용하지 않는 메서드에 의존하도록 강제되어서는 안 된다"라는 원칙이다. 상수 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 상수에 의존하게 된다. 이는 ISP 원칙을 위배한다.

  3. 불필요한 상속: 클래스가 상수 인터페이스를 구현하면, 해당 클래스의 인스턴스는 상수 인터페이스에 정의된 모든 상수를 상속하게 된다. 이로 인해 불필요한 상수가 클래스에 추가될 수 있다.

  4. 유연성의 결여: 후에 상수들의 정의나 그룹핑이 바뀔 경우, 상수 인터페이스를 수정하는 것은 해당 인터페이스를 구현하는 모든 클래스에 영향을 미칠 수 있다.

  5. 캡슐화 위배: 클래스는 자신의 상태와 행동을 캡슐화해야 한다. 상수 인터페이스를 구현하면 해당 상수가 클래스의 일부가 되므로, 이 클래스의 내부 구현 세부사항이 외부에 노출될 수 있다.

요약하면, 상수 인터페이스 패턴은 인터페이스의 주요 목적과 객체 지향 원칙에서 벗어난다. 상수를 정의하는 더 나은 방법은 public static final 변수를 포함하는 최종 클래스를 사용하는 것이다.

2. 구현 세부사항 노출

인터페이스에 상수를 정의하면, 그 인터페이스를 구현하는 모든 클래스에서 해당 상수에 접근할 수 있게 된다. 이로 인해 불필요한 세부사항이 노출될 수 있다.

3. 유연성

나중에 상수를 변경하거나 추가해야 할 때, 인터페이스에 정의된 상수는 인터페이스의 일부로 간주되므로, 이를 변경하는 것은 기존의 클라이언트 코드에 영향을 줄 수 있다.

따라서, 상수를 클래스 내부에 public static final로 정의하는 방식은 위와 같은 문제점을 피할 수 있다. 추가적으로, Java 8 이후로 인터페이스에 메서드 구현 (디폴트 메서드나 static 메서드)이 가능해졌기 때문에, 인터페이스의 목적과 사용 방식이 더욱 중요해졌다.

요약하면, 상수를 정의할 때는 클래스 내의 public static final 변수를 사용하는 것이 더 나은 방법이다.

0개의 댓글