인스턴스화를 막는 이유
1. 불필요한 인스턴스 생성 방지
어떤 클래스가 여러 번 인스턴스화되어도 동일한 객체를 반환해야 할 때가 있다.
이런 경우, 생성자를 직접 호출하지 못하게 하고 미리 생성된 인스턴스를 제공함으로써 불필요한 객체 생성을 방지해 메모리와 성능을 최적화할 수 있다.
2. 상태의 불변성 유지
비밀번호 해싱 라이브러리같이 해싱된 비밀번호를 변경하지 못하도록 하기 위해 인스턴스화를 막을 수 있다.
3. 싱글톤 패턴
싱글톤은 어떤 클래스의 인스턴스가 오직 하나만 존재해야 하는 경우 사용된다.
이 경우, 클래스의 생성자를 private로 만들어 외부에서 인스턴스를 생성하지 못하게 하고, 정적 메서드나 정적 변수를 사용하여 하나의 인스턴스를 관리한다.
4. 상속 제어
어떤 클래스를 다른 클래스에서 상속할 수 없도록 하려면 생성자를 private로 만들면 된다.
이렇게 하면 하위 클래스에서 상위 클래스의 생성자를 호출할 수 없으므로 상속을 방지할 수 있다.
5. 유틸리티 클래스
일부 클래스는 객체를 생성하지 않고 정적 메서드나 정적 변수를 통해 유틸리티 기능을 제공한다.
이러한 클래스는 주로 인스턴스화를 방지하기 위해 private 생성자를 사용한다.
6. 보안과 무결성
중요한 리소스나 데이터를 관리하는 클래스의 경우, 무분별한 인스턴스화를 방지하여 보안과 데이터 무결성을 유지하는 것이 중요하다.
private 생성자
public class UtilityClass {
// 기본 생성자가 만들어지는 것을 막음
private UtilityClass() {
throw new AssertionError();
}
...
}
명시적 생성자가 없을 경우 컴파일러를 통해 자동으로 기본 생성자가 만들어지기 때문에 인스턴스화가 가능하다.
따라서 명시적 private 생성자를 만들어 인스턴스화를 막을 수 있다.
클래스를 추상 클래스로 만들어 인스턴스화를 방지하려는 것은 사용자가 추상 클래스의 하위 클래스를 만들어 인스턴스화할 수 있기 때문에 인스턴스화를 방지할 수 없다.
이 방식은 하위 클래스가 상위 클래스의 생성자를 호출하지 못하므로 상속을 불가능하게 하는 효과도 있다.
'Study > 이펙티브 자바' 카테고리의 다른 글
[effectice java] item 3. private 생성자나 열거 타입으로 싱글톤임을 보장하라 (0) | 2023.09.24 |
---|---|
[effectice java] item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2023.09.22 |
[effectice java] item 1. 생성자 대신 정적 팩토리 메소드를 고려하라 (0) | 2023.09.07 |