결론 : "자바에서 프로그래밍 중에는 가끔 인스턴스화를 막아놓고 사용하는 클래스들이 필요한데 이러한 경우 private 생성자 만을 생성해서 인스턴스화를 막자"
정적 메서드와 정적 필드만을 담은 클래스
- 객체 지향적인 사고와는 거리가 조금 먼 클래스
1. 정적 메서드를 모아놓고 사용 가능
- java.lang.Math, java.util.Arrays처럼 기본값이나 배열관련 메서드들을 모아놓을 수 있다.
- java.util.Collections처럼 특정 인터페이스를 구현하는 객체들을 생성해주는 메서드들을 모아놓을 수 있다.
(자바8부터는 이러한 메서드들을 인터페이스 내부에 구현 가능)
- final 클래스(상속이 불가능한 클래스)와 관련된 메서드들을 모아놓을 수 있다. (상속이 불가능하기에 모아놓고 이를 사용하기 위해)
2. 정적 필드만 담은 클래스의 목적
- 예를 들어, 정적 필드만을 담은 유틸리티 클래스는 인스턴스화를 목적으로 만든것이 아니다. 따라서 private 기본 생성자를 설정을 해두어야 한다. (기본적으로 자바는 생성자 작성을 안하면 기본 생성자를 public으로 생성해 둔다. 따라서 인스턴스화가 가능해진다.)
- 기본적으로 추상 클래스는 인스턴스화를 막지만 추상 클래스로는 아예 인스턴스화를 막을 수는 없다.
(인스턴스화를 막는것이 불가능하다. -> 하위클래스를 만들어 인스턴스화 하면 그만이기 때문이다.)
- 아래와 같이 작성시 클래스 내부에서도 인스턴스를 생성할 수 없게 막아준다.
- 또한 private 생성자만을 생성해 놓으면 상속또한 불가능하다. 상속관계에서 하위클래스들은 암묵적으로 상위클래스의 생성자를 호출하는데 private 설정된 생성자만 있다면 하위클래스에서 해당 클래스의 생성자를 호출할 수 없기 때문에 상속관계 성립이 불가능하다.
- 추상 클래스에서도 생성자를 private 설정시 상속 불가능하게 가능하다.
private testClass(){
throw new AssertionError();
}
코드 정리
https://github.com/mokjaemin/EffectiveJAVA
'Language > Java Plus' 카테고리의 다른 글
Effective JAVA - Item6 : 불필요한 객체 생성을 피하라. (0) | 2023.09.12 |
---|---|
Effective JAVA - Item5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2023.06.22 |
Effective JAVA - Item3 : private 생성자나 열거 타입으로 싱클턴임을 보증하라. (0) | 2023.06.07 |
Effective JAVA - Item2 : 생성자에 매개변수가 많다면 빌더를 고려하라. (0) | 2023.06.02 |
Effective JAVA - Item1 : 생성자 대신 정적 팩토리 메서드를 고려하라. (1) | 2023.05.16 |