static 메소드와 static 필드만을 담은 클래스는 객체 지향에 어긋난다고 한다.
👇이유
그럼에도 java.lang.Math, java.util.Arrays, java.util.Collections처럼 필요한 경우가 종종 있다.
더보기
ex1) java.lang.Math, java.util.Arrays : 기본 타입 값이나 배열 관련 메소드들을 모아놓았다.
ex2) java.util.Collections : 특정 인터페이스를 구현하는 객체를 생성해주는 생성해주는 정적 메소드(혹은 팩토리)를 모아놓았다.
ex3) fianl 클래스와 관련한 메소드들을 모아놓았다.(final 클래스를 상속해서 하위 클래스에 메소드를 넣는 것은 불가능)
애초에 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만드려고 구현한 게 아니다. 그러나 컴파일러가 자동으로 기본 생성자를 만들어주기 때문에 인스턴스화가 되기도 한다.
추상 클래스
그래서 유틸리티 클래스가 인스턴스화를 막기 위해 abstract로 만드는 것을 본 적이 있을 것이다.
그러나 하위 클래스를 상속해서 인스턴스화할 수 있기 때문에 의도와 달라진다.(아이템 19)
(추상 클래스를 final로 정의하면 되지 않을까 생각했는데 컴파일 에러가 발생한다.)
private 생성자
따라서 private 생성자를 생성해 인스턴스화를 막는다. 이 방법은 상위 클래스의 생성자에 접근할 수 없으므로 상속 또한 불가능하게 한다.
주의해야 할 점은 코드가 명시적이지 않기 때문에 주석을 남겨주자.
// Noninstantiable utility class
public class UtilityClass {
// 인스턴스화 방지용
private UtilityClass() {
throw new AssertionError(); // 클래스 안에서 호출되지 않기 위함
}
}
'Language > Java' 카테고리의 다른 글
| [effective java] 아이템 7. 다 쓴 객체 참조를 해제하라. (0) | 2023.03.04 |
|---|---|
| [effective java] 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2023.03.02 |
| [effective java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. (0) | 2023.03.02 |
| [effective java] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라. (0) | 2023.03.01 |
| [effective java] 아이템 6. 불필요한 객체 생성을 피하라. (0) | 2023.03.01 |
