JAVA/Effective Java

[아이템 22] 인터페이스는 타입을 정의하는 용도로만 사용하라

꾸준함. 2024. 2. 7. 11:23

클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스가 무엇을 할 수 있는지를 클라이언트에게 얘기해 주는 것이며 인터페이스는 오직 이러한 용도로 사용해야 합니다.

 

인터페이스를 잘 사용한 예

아래 예시 코드는 인터페이스를 효과적으로 활용한 좋은 예입니다.

자전거 인스턴스가 이동수단의 타입이라는 것을 잘 표현하고 있습니다.

 

 

 

인터페이스를 잘 못 사용한 예

상수 인터페이스 안티패턴은 인터페이스를 부적절하게 활용하는 대표적인 예시입니다.

 

 

 

 

앞서 언급한 대로, 인터페이스는 주로 타입을 정의하는 데 사용되어야 합니다.

그러나 PhysicalConstant 인터페이스는 상수만을 정의하고 있어서 MyClass를 PhysicalConstant 타입이라고 정의할 수 없습니다.

  • 물론 위 코드처럼 기술적으로 정의할 수는 있지만 설계적인 관점에서는 적합하지 않음
  • 클라이언트 입장에서는 클래스 형태만을 보고 PhysicalConstant physicalConstant = new MyClass()와 같이 코드를 작성 시도할 수도 있음

 

또한, MyClass 내에서만 사용되는데도 불구하고 인터페이스에 상수가 정의되어 공개되었으므로 캡슐화가 깨진 상태입니다.

 

 

상수를 정의하는 방법

1. 특정 클래스에서만 사용되는 경우

 

만약 특정 클래스에서만 상수가 사용될 경우, 아래 코드처럼 해당 클래스에 private static final로 상수를 선언하는 것을 권장합니다.

 

 

 

2. Enum형

 

Enum형으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개하는 것을 권장합니다.

Enum으로 공개하기 적합한 상수는 주로 프로그램의 고유한 타입이나 카테고리를 나타내는 데 사용됩니다.

 

 

 

 

3. 인스턴스화 할 수 없는 유틸리티 클래스

 

여러 클래스에서 사용되는 상수의 경우, 인스턴스화할 수 없는 아이템 4에서 다루었던 상수 유틸리티 클래스를 정의하는 것이 권장됩니다.

인터페이스는 구현하는 것을 막을 수 없지만 유틸리티 클래스는 생성자를 private으로 선언함에 따라 상속 및 인스턴스화를 막을 수 있습니다.

 

 

 

참고

이펙티브 자바

이펙티브 자바 완벽 공략 2부 - 백기선 강사님

 

 

반응형