Skip to content

Latest commit

 

History

History
47 lines (28 loc) · 1.78 KB

04.인스턴스화를 막으려거든 private 생성자를 사용하라.md

File metadata and controls

47 lines (28 loc) · 1.78 KB

인스턴스화를 막아야 하는 상황은 언제일까요?

가끔 정적 필드와 정적 메소드만을 갖고 있는 클래스가 필요한 상황이 있습니다. 이러한 유틸리티 클래스는 인스턴스로 사용하기 위해 생성한 것은 아닙니다.

그런데, 이러한 의도를 어떻게 코드로 나타낼 수 있을까요?

생성자를 명시하지 않으면, 컴파일러는 자동으로 기본 생성자를 생성하게 됩니다.

public class UtilityClass {

    //기본 생성자
    public UtilityClass() {
    }
}

기본 생성자의 접근 제어자는 public이죠. 그렇다면 언제든지 외부에서 해당 클래스 인스턴스를 만들 가능성이 있습니다.

인스턴스화를 막을 방법은 무엇일까요?

  • 여기서 추가로, ‘인스턴스를 안 만들려면, 추상 클래스로 만들면 되지 않을까?’ 라고 생각할 수 있지만, 추상 클래스로는 인스턴스를 막을 수 없습니다.

    → 하위 클래스를 생성하여 인스턴스화할 수 있기 때문입니다.

    → 추상 클래스를 상속하여 쓰라는 의미로 이해할 수 있습니다. → 더 큰 문제!

올바른 해결 방법은 private 생성자를 생성하는 것입니다.

public class UtilityClass {

    private UtilityClass() {
    }
}

그렇다면 외부에서 새로운 인스턴스를 생성하지 못하니, 클래스의 인스턴스 화를 막을 수가 있습니다.

추가적으로 상속도 막을 수 있습니다. (생성자가 private이기 때문에, 상위 클래스의 생성자에 접근할 수가 없습니다.)

Reference

조슈아 블로크, 이펙티브 자바 Effective Java 3/E, 2018

https://parkadd.tistory.com/74