[아이템12] 정적 유틸리티 클래스는 toString을 제공할 이유가 없다.

2024. 7. 1. 17:09BOOKS/이펙티브 자바

정적 유틸리티 클래스는 일반적으로 정적 메서드만 가지는 클래스이고, 필드가 있더라도 클래스를 나타내는 정보가 아니라 메서드의 기능을 수행하기 위해 필요한 정보를 저장하는 필드이므로 toString으로 보여줄 만큼 유용한 정보가 없기 때문에 toString을 제공할 필요가 없다.

정적 유틸리티 클래스란?

정적 유틸리티 클래스(Static Utility Class)는 자바에서 유용한 기능을 제공하는 정적 메서드(Static Methods)로 구성된 클래스입니다. 이러한 클래스는 주로 인스턴스 변수를 가지지 않고, 객체를 생성하지 않고도 메서드를 직접 호출하여 작업을 수행합니다. 정적 유틸리티 클래스는 코드의 모듈화와 재사용을 촉진하며, 자주 사용되는 기능을 논리적으로 그룹화하는 데 유용합니다.

정적 유틸리티 클래스가 필드를 가지는 경우

몇 가지 특별한 경우에는 정적 필드(static fields)를 가지는 정적 유틸리티 클래스를 정의할 수 있습니다. 이러한 정적 필드는 주로 다음과 같은 목적을 위해 사용됩니다:

  1. 상수와 설정 값: 정적 유틸리티 클래스는 종종 상수나 설정 값과 관련된 정적 필드를 포함합니다. 예를 들어, 수학 관련 유틸리티 클래스가 원주율 값을 저장하는 정적 필드를 가질 수 있습니다.

     public class MathUtility {
         public static final double PI = 3.14159265359;
     }
  2. 캐시: 계산 비용이 높은 결과를 캐싱하기 위해 정적 필드를 사용할 수 있습니다. 예를 들어, 계산 결과를 한 번만 수행하고 그 결과를 정적 필드에 저장하여 나중에 재사용할 수 있습니다.

     public class CalculationCache {
         private static Map<Integer, Long> cache = new HashMap<>();
    
         public static long calculateFactorial(int n) {
             if (cache.containsKey(n)) {
                 return cache.get(n);
             } else {
                 long result = calculateFactorialRecursive(n);
                 cache.put(n, result);
                 return result;
             }
         }
    
         private static long calculateFactorialRecursive(int n) {
             // 팩토리얼 계산 로직
         }
     }
  3. 싱글톤 패턴: 정적 필드를 사용하여 싱글톤 패턴을 구현할 수도 있습니다. 싱글톤 패턴은 애플리케이션에서 단 하나의 인스턴스만 허용하는 디자인 패턴입니다.

     public class Singleton {
         private static Singleton instance;
    
         private Singleton() {
             // 생성자를 private으로 선언하여 외부에서 인스턴스 생성을 막음
         }
    
         public static Singleton getInstance() {
             if (instance == null) {
                 instance = new Singleton();
             }
             return instance;
         }
     }

따라서 정적 유틸리티 클래스에는 정적 필드가 포함될 수 있지만, 주로 정적 메서드를 통해 제공되는 기능과 연관된 데이터를 저장하거나 특정 목적을 위해 사용됩니다.