티스토리 뷰

(Effective Java) 규칙22. 인터페이스는 타입을 정의하는 용도로만 사용하라


인터페이스의 목적


  • 인터페이스를 구현하는 클래스를 만들게 되면, 그 인터페이스는 해당 클래스의 객체를 참조할 수 있는 자료형(type) 역할을 하게 된다.

    • 해당 클래스의 객체로 어떤 일을 할 수 있는지 클라이언트에게 알리는 행위임
  • 인터페이스의 목적은 여기까지이며 다른 목적으로 인터페이스를 정의 하고 사용하는 것은 적절치 못함

 

인터페이스를 잘못 사용하는 예


상수 인터페이스(constant interface)

  • 형태

    • 메서드가 없고, static final 필드만 있는 형태로 모든 필드는 상수 정의임
    • 대체로 상수 이름 앞에 클래스 이름을 붙이는 번거로움을 피하기 위해서임

       

      //상수 인터페이스 안티패턴 - 사용하지 말 것!
      public interface PhysicalConstants {
        //아보가드로 수(1/mol)
        static final double AVOGADRO_NUMBER = 6.02214199e23;
      
        //볼쯔만 상수(J/K)
        static final double BOLZMANN_CONSTANT = 1.3806503e-23;
      
        //전자 질량(kg)
        static final double ELECTRON_MASS = 9.10938188E-31;
      }
  • 문제점

    • 상수 정의를 인터페이스에 포함시키면 구현 세부사항이 클래스의 공개 API에 스며들게 되고 혼동을 줄 우려가 있음
    • 자바 플랫폼 라이브러리에도 상수 인터페이스가 몇개 있는데 java.io.Object.StreamConstants 실수로 포함된 것으로 생각해야 하고 따라해서는 절대 안됨
  • 다른 대안

    • 해당 상수가 이미 존재하는 클래스나 인터페이스에 강하게 연결되어 있을 때는 그 상수들을 해당 클래스나 인터페이스에 추가 하는 것
      • 예) 기본 자료형의 객체 표현형들(Integer, Double)의 MIN_VALUE, MAX_VALUE상수
    • 이런 상수들이 enum 자료형의 멤버가 되어야 바람직할 때는 enum 자료형(규칙 30)과 함께 공개되어야 함
      • 그렇지 않을 때는 해당 상수들을 객체 생성이 불가능한 유틸리티 클래스에 넣어서 공개해야 함
    • 앞선 형태를 바꾼 모습
      //상수 유틸리티 클래스
      package com.effective.java.science;
      
      public class PhysicalConstants {
              private PhysicalConstants() {  } //객체 생성을 막음
      
              public static final double AVOGADRO_NUMBER = 6.02214199e23;
              public static final double BOLZMANN_CONSTANT = 1.3806503e-23;
              public static final double ELECTRON_MASS = 9.10938188E-31;
      }

 

결론


  • 인터페이스는 자료형을 정의할 때만 사용해야 한다.

  • 특정 상수를 API의 일부로 공개할 목적으로는 적절치 않다.


끝으로

이 글이 도움이 되었다면, Google 광고 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다!

반응형
댓글