반응형
인스턴스화를 막으려거든 private 생성자를 사용하라
java.lang.Math
나 java.util.Collections
처럼 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶은 경우가 있을 것이다. 해당 유틸리티 클래스들은 인스턴스로 만들어 쓰려고 설계한게 아니지만, 생성자를 명시하지 않아도 컴파일러가 자동으로 빈 생성자를 만들어준다.
- 추상클래스는
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
으로 선언하여 클래스 외부에서 접근할 수 없도록 한다.
- 또한 다음과 같이 상속을 불가능하게 하는 효과도 있다. 명시적 생성자가 존재하므로 빈 생성자가 생성되지 않고, 명시된 생성자가
private
하므로 하위 클래스에서 상위 클래스 생성자에 접근할 방법이 없기 때문이다.
REFERENCES
https://velog.io/@gillog/Java-Abstract-Class%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4
반응형