Effective Java를 읽고 정리한 정리본입니다.

📌 Item 04 : 인스턴스화를 막으려거든 private 생성자를 사용하라

🫧 인스턴스화

인스턴스화의 정의를 알기 전, 인스턴스란 무엇인지부터 짚고 넘어가자.

✨ 인스턴스

객체를 생성하여 JVM(자바 가상 머신)이 관리하는 메모리에 적재된 것을 의미한다.

객체는 인스턴스를 포함하는 일반적인 의미로 쓰이며, 인스턴스화는 말 그대로 클래스로부터 인스턴스를 생성하는 것을 말한다.

즉, 클래스 -> 인스턴스화 과정을 거쳐 인스턴스(객체) 가 생성되는 것이다.

이번 챕터에서는 방금 설명한 “인스턴스화”를 private 생성자를 사용해 막는 방법을 알려주고자 한다.

🫧 인스턴스화를 막는 방법

자바에서는 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다.

이러한 클래스는 인스턴스화가 가능해지고, 이는 사용자의 실수로 인해 인스턴스가 새로 생성될 수 있는 문제로 이어진다.

Item 03 : private 생성자나 열거 타입으로 싱글턴임을 보장하라 에서도 비슷한 이야기를 하고 있다.

만약 자동으로 기본 생성자가 만들어지는데 그것이 싱글턴 클래스가 되어야 하는 일이라면 예기치 않은 오류가 발생하게 되므로 주의 해야 할 것 이다.

그렇다면 어떻게 인스턴스화를 막을 수 있을까?

1. 추상 클래스로 만들어라

추상 클래스는 ~한 이유로 인해 표면적으로는 인스턴스화를 막을 수 있다고 여겨진다.

그러나 본질적인 문제를 해결할 수는 없을 것이다. 추상 클래스로 만든 클래스를 상속 받아 하위 클래스로 만들면 인스터화가 또 가능해진다.

2. private 생성자

그렇기에 두 번째 해결 방법이 등장했다.

컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없는 경우이므로, private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있는 것이다.

public class UtilityClass {
  // 기본 생성자가 만들어지는 것을 막는다 (인스턴스 방지용)
  private UtilityClass() {
    throw new AssertionError();
  }
  ...
}

이 방식은 상속 또한 막는다.

모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하게 되는데, 이를 private으로 선언했으므로 하위 클래스가 상위 클래스의 생성자에 접근하지 못하게 되므로 이러한 효과를 얻을 수 있는 것이다.

📌 추가 공부 및 질문

🫧 정적 메서드와 정적 필드만을 담은 클래스는 왜 객체 지향적이 아닌가?

🫧 추상 클래스는 어떻게 인스턴스화를 막을 수 있을까?

🫧 유틸리티 클래스

📌 참고 자료