본문 바로가기
Computer Sience/Java

[Effective Java] 아이템4: 인스턴스화를 막으려거든 private 생성자를 사용하라

by 제우제우 2024. 10. 26.

Chapter 02: 객체 생성과 파괴

객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법

올바른 객체 생성 방법에 대한 설명

유틸성 클래스 

단순히 정적 메소드와 정적 필드를 담은 클래스 

이런 클래스는 인스턴스화를 할 필요가 없다 

→ 인스턴스화를 막아보자. 

 

이런 유틸 성격을 가지는 클래스는 자바 / 스프링 쉽게 찾아볼 수 있다. 

java.lang.Math 

java.util.Arrays

java.util.Collections

 

Collections는 특정 인터페이스의 구현하는 객체들을 생성해 주는 정적 팩토리 메소드를 모아놓았다. 

사용자는 해당 구현체를 몰라도 사용할 수 있다는 관점에서 알아야 하는 개념적인 무게가 줄었다고 볼 수 있다. 

public final class Math {
    private Math() {}
}

public class Arrays {
    private Arrays() {}
}

public class Collections {
    private Collections() {}
}

 

전부 생성자의 접근 제어자를 private 설정하였다. 

private으로 설정하면 사실 어떤 방식으로도 인스턴스화가 불가능하다 (리플렉션 제외) 

 

final 키워드가 안 붙었으니까 상속이 가능하다고 생각하겠지만

자바에서는 자식 클래스가 부모 클래스의 생성자를 명시적으로든 암묵적으로든 호출하게 되어있다. 

그런데 부모 클래스의 생성자가 private 생성자 1개만 존재한다면 컴파일 오류가 일어난다. 

 

또한 당연히 자체 인스턴스화도 불가능하다.