제육's 휘발성 코딩
article thumbnail
반응형

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

java.lang.Mathjava.util.Collections 처럼 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶은 경우가 있을 것이다. 해당 유틸리티 클래스들은 인스턴스로 만들어 쓰려고 설계한게 아니지만, 생성자를 명시하지 않아도 컴파일러가 자동으로 빈 생성자를 만들어준다.

image

  • 추상클래스는 abstract 명시로 인스턴스화 할 수 없기 때문에 추상클래스로 해결할 수 있지만, 추상클래스를 상속하여 하위 클래스에서 인스턴스화를 한다면 해결되지 않는다.

 

public abstract class UtilityClass {
  public abstract void print();
}

class Child extends UtilityClass {

  @Override
  public void print() {
    System.out.println("테스트");
  }
}

class AbsTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.print();
  }
}
  • 다음과 같이 추상 클래스를 상속한 자식 클래스에서 인스턴스화 할 수 있다.

 

즉, 생성자를 명시해준다면 빈 생성자를 만들어주지 않는다. 따라서 private한 생성자를 만들어서 외부에서 호출을 방지한다면 인스턴스화를 차단할 수 있다.

public class UtilityClass {
  // 인스턴스화 방지
  private UtilityClass() {
    throw new AssertionError();
  }
}
  • 다음과 같이 명시적 생성자가 private으로 선언하여 클래스 외부에서 접근할 수 없도록 한다.

 

image

  • 또한 다음과 같이 상속을 불가능하게 하는 효과도 있다. 명시적 생성자가 존재하므로 빈 생성자가 생성되지 않고, 명시된 생성자가 private하므로 하위 클래스에서 상위 클래스 생성자에 접근할 방법이 없기 때문이다.

REFERENCES

https://velog.io/@gillog/Java-Abstract-Class%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^