
언제 인스턴스화를 막는 것이 필요할까?
1. 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때 사용한다.
- 예를 들면, java.lang.Math, java.util.Arrays, java.util.Collections
2. 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리)를 모아놓는다.
3. final 클래스와 관련한 메서드들을 모아놓을 때 사용한다.
- final 클래스를 상속해서 하위 클래스에 메서드를 넣는 것은 불가능하다.
그럼 어떻게 인스턴스화를 막을 수 있을까?
생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다.
실제로 공개된 API들에서도 이처럼 의도치 않게 인스턴스화를 할 수 있게 된 클래스가 종종 있다.
1. 추상 클래스로 만드는 것 --> 불가능
추상 클래스로 만드는 것은 인스턴스화를 막을 수 없다.
하위 클래스를 만들어 인스턴스화를 하면 그만이다.
2. private 생성자를 추가 --> 가능
private 생성자를 추가하여 클래스의 인스턴스화를 막을 수 있다.
명시적 생성자가 private이라 클래스 바깥에서 접근할 수 없고, 상속을 불가능하게 하는 효과도 있다.
모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하게 되는데,
이를 private으로 선언했으니 하위 클래스가 상위 클래스의 생성자에 접근할 길이 막혀버린다.

반응형
'Java > Effective Java' 카테고리의 다른 글
Effective Java 6. 불필요한 객체 생성을 피하라 (0) | 2022.01.06 |
---|---|
Effective Java 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.01.04 |
Effective Java 3. 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2021.12.28 |
Effective Java 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2021.12.25 |
Effective Java 1. 생성자 대신 정적 팩터리 메서드를 고려하라. (0) | 2021.12.24 |