[개발일지] 230529 인스턴스화를 막기 위해 private 생성자를 사용하자

오늘 새로 배운 내용

이펙티브 자바 아이템 4를 읽던 중 처음 알게 된 사실이 있다.

 

자바 클래스에 생성자를 명시해주지 않을경우에 컴파일러가 자동으로 매개변수를 받지 않는 public 기본 생성자를 만들어 준다는 사실을 전혀 모르고 있었다.

 

public 한 기본 생성자가 있을 경우 의도치 않게 클래스가 인스턴스화될 가능성이 존재한다.

문제가 되는건 인스턴스로 만들어 쓰려고 설계한 클래스가 아닌데 인스턴스화가 되면 안 되기 때문에 인스턴스화를 막아야 한다. 

 

인스턴스화할 필요가 없는 클래스들이 존재하는데 (예를 들어 java.lang.Math나 java.util.Array처럼 기본 타입값이나 배열 관련 메서드만 모아놓은 클래스들) 이러한 클래스들은 private 생성자를 추가해 인스턴스화를 막고 있다.

 

컴파일러가 자동으로 public 생성자를 만드는 경우는 클래스에 명시된 생성자가 없을 경우에만 만들기 때문에 private 생성자를 추가하면 된다.

 

실제로 Math 클래스와 Collections 클래스안에 들어가 보니 private로 선언된 기본 생성자가 존재하고 있었다.

그리고 친절하게 주석으로 인스턴스화를 막는다는 목적으로 사용되는 생성자라고 알려주고 있다.

 

java.lang.Math

 

java.util.Collections

 

이렇게 private로 생성자를 선언하면 클래스 바깥에서 접근할 수 없어 의도치 않게 클래스의 인스턴스화를 막을 수 있다.

 

결론

인스턴스화할 필요가 없는 클래스들은 자동으로 public 기본생성자가 만들어지는걸 막기 위해 private 생성자를 만들어 인스턴스화를 막자.