Skills/Java

Java - 인스턴스화를 막으려면 private 생성자를 사용하라

aoaa 2022. 10. 30. 20:40

 Java로 코드 작성 시, 정적 메서드와 정적 필드만을 담은 클래스를 만드는 경우가 종종 있습니다.

 

예를 들어, java.lang.Math와 같이 기본 타입 값이나 java.util.Array처럼 배열 관련 메서드를 모아놓을 수 있습니다. 또한

java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성하는 정적 메서드를 모아놓을 수 있고, final 클래스와 관련된 메서드를 모아놓을 때 사용합니다. (final 클래스를 상속하여 하위 클래스에 메서드를 넣는 것은 불가능) 하지만 위에서 나열한 정적 멤버만을 담은 utility class는 인스턴스로 만들어 쓰려고 설계한 것이 아닙니다.

 정적 멤버만 담은 uility class에 생성자를 명시하지 않으면 JVM이 기본 생성자를 자동으로 만들어주는데, 이는 매개변수를 받지 않는 public 생성자를 만들어 의도치 않게 API를 공개할 수가 있게됩니다. 이는 추상 클래스로 만드는 것으로도 인스턴스화를 막을 수 없는데, 이 때 private 생성자를 추가하여 클래스의 인스턴스화를 막을 수 있습니다. 


1. private 생성자

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

 JVM의 컴파일러가 기본 생성자를 생성할 수 없도록 명시적으로 private 생성자를 만들었습니다. 

이는 객체가 생성될 가능성을 없애서 인스턴스화를 막고, 하위 클래스 생성을 막을 수 있습니다. 이 때, private 생성자가 목적대로 쓰이지 않고 있기 때문에 위처럼 따로 주석을 달아놓는 것이 좋을 것입니다.

 

 

 

 

 

참조