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

2024. 10. 15. 23:30·1️⃣ 백앤드/이펙티브 자바

1. 인터페이스의 용도

클래스가 어떠한 인터페이스를 구현한다는 것은, 자신의 인스턴스로 무엇을 할 수 있을지 클라이언트에게 정리해 주는 것이다. 인터페이스는 오직 이 용도로만 사용해야한다. 지침에 맞지 않게 사용한 인터페이스가 있다. 바로 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스인 '상수 인터페이스' 다.

public interface PhysicalConstants {
    // 아보가드로 수 (1/몰)
    static final double AVOGADROS_NUMBER   = 6.022_140_857e23;

    // 볼츠만 상수 (J/K)
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;

    // 전자 질량 (kg)
    static final double ELECTRON_MASS      = 9.109_383_56e-31;
}

 

클래스 내부에서 사용하는 상수를 굳이 외부 인터페이스에 나타낼 필요가 없다. java.io.ObjectStreamConstats 등, 자바 플랫폼 라이브러리에서도 상수 인터페이스가 더 몇개 있지만, 따라해선 안된다.

따라하지 말아야 하는 상수 인터페이스

 

2. 상수를 공개할 목적의 인터페이스

특정 클래스나 인터페이스와 강하게 연관된 상수라면, 그 클래스나 인터페이스 자체에 추가해야한다.

 

숫자 기본 타입의 박싱 클래스인 Integer , Double 의 MIN_VALUE 나, MAX_VALUE 상수가 이런 예시다.

만약, 열거 타입으로 나타내기 적합한 상수라면, 열거 타입으로 만들어 공개하면 된다.
모두 안된다면, 인스턴스화 할 수 없는 유틸리티 클래스에 담아 공개하면 된다.
public class PhysicalConstants {
    private PhysicalConstants() { }  // private 생성자로 인스턴스화 방지

    // 아보가드로 수 (1/몰)
    public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    // 볼츠만 상수 (J/K)
    public static final double BOLTZMANN_CONST  = 1.380_648_52e-23;
    // 전자 질량 (kg)
    public static final double ELECTRON_MASS    = 9.109_383_56e-31;
}

 

앞서 보여준 PhysicalConstants 의 유틸리티 클래스 버전이고, PhysicalConstants.상수명 으로 사용하면 된다. 굳이 상수 인터페이스를 만들 필요가 없는 것이다. 추가로, 유틸리티 클래스의 상수를 빈번히 사용한다면 정적 임포트 하여 클래스 이름은 생략 가능하다.

import static effectivejava.chapter4.item22.constantutilityclass.PhysicalConstants.*;

public class Test {
    double atoms(double mols){
        return AVOGADROS_NUMBER * mols;
    }
    ...
    // PhysicalConstants 를 빈번히 사용한다면 정적 임포트가 값어치를 한다.
}

'1️⃣ 백앤드 > 이펙티브 자바' 카테고리의 다른 글

[아이템24] 멤버 클래스를 되도록 static 으로 만들어라  (2) 2024.10.17
[아이템23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라  (0) 2024.10.16
[아이템21] 인터페이스는 구현하는 쪽을 생각해 설계해라  (2) 2024.10.14
[아이템20] 추상 클래스보다는 인터페이스를 우선하라  (0) 2024.10.14
[아이템19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.  (0) 2024.10.10
'1️⃣ 백앤드/이펙티브 자바' 카테고리의 다른 글
  • [아이템24] 멤버 클래스를 되도록 static 으로 만들어라
  • [아이템23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라
  • [아이템21] 인터페이스는 구현하는 쪽을 생각해 설계해라
  • [아이템20] 추상 클래스보다는 인터페이스를 우선하라
HOZINU
HOZINU
주니어 백앤드 개발자의 세상만사 이모저모. 주로 개발 이야기를 다룸.
  • HOZINU
    백엔드 탐험 일지
    HOZINU
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • ⛪ HOME
    • 🌍 GITHUB
    • 카테고리 (73)
      • 1️⃣ 백앤드 (72)
        • 이펙티브 자바 (72)
      • 2️⃣ CS (0)
        • 운영체제 (0)
        • 네트워크 기초 (0)
        • 네트워크 응용 (0)
        • SSL & PKI (0)
        • 기타 (0)
      • 3️⃣ 코딩테스트 (0)
      • 4️⃣ 개인공부 (0)
        • MSA (0)
        • REDIS (0)
      • 5️⃣ 일상이야기 (1)
  • 인기 글

  • 태그

    로타입
    try-with-resources
    Cleaner
    컴포지션
    계층구조
    표준예외
    멤버클래스
    CLONE
    정적 팩터리 메서드
    캡슐화
    hashcode
    싱글턴
    optional
    Comparable
    맥북
    의존객체
    정보은닉
    equals
    빌더
    finalizer
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
HOZINU
[아이템22] 인터페이스는 타입을 정의하는 용도로만 사용하라
상단으로

티스토리툴바