> For the complete documentation index, see [llms.txt](https://yihyuns-gitbook.gitbook.io/today-i-learned/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yihyuns-gitbook.gitbook.io/today-i-learned/java/effective-java/item_4._private_constructor.md).

# Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

## 절대 인스턴스화될 일이 없는 클래스?

* 상태값이 없는, 단순히 특정 기능만을 수행하는 클래스
  * 이 경우 메서드들만 존재하므로 인스턴스가 존재할 필요가 없음

### 예시

* java.lang.Math, java.lang.Arrays 와 같이 수학 연산 / 배열 등 특정 주제의 동작을 수행하는 클래스들
* Arrays 클래스는 내부적으로 아래와 같은 생성자만을 갖는다.

  ```java
  // Suppresses default constructor, ensuring non-instantiability.
  private Arrays() {}
  ```

## private 생성자로 만드는 이유?

### 생성자 안 쓸 거니까 생성자 안 만들면?

* 컴파일러에 의해 public 접근 제어자를 갖는 기본 생성자가 생김
* 인스턴스 만들기 가능

### abstract 클래스로 선언하면?

* 상속을 하고, 자식 클래스의 인스턴스를 만들 수 있음

### private 생성자

* 생성자를 명시적으로 만들었으므로 public 기본 생성자가 생기지 않음
* 상속을 해도 부모 클래스의 생성자를 호출할 수 없어 인스턴스 생성 불가능

## 생성자 내부에서 예외 던지기

* Item 3에서 언급했듯 생성자를 private으로 선언해도 리플렉션에 의해 호출될 수 있음
* 그리고 해당 클래스 내부에서 메서드 정의 중 실수로 생성자를 호출할 수도 있음
* 이러한 경우를 방지하기 위해 private 생성자 내에서 예외를 던지는 것도 좋은 방법임
