본문 바로가기

Language/Java Plus

Effective JAVA - Item4 : 인스턴스화를 막으려거든 private 생성자를 사용하라.

 

결론 : "자바에서 프로그래밍 중에는 가끔 인스턴스화를 막아놓고 사용하는 클래스들이 필요한데 이러한 경우 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

 

GitHub - mokjaemin/EffectiveJAVA: Study Files Of Effective JAVA

Study Files Of Effective JAVA. Contribute to mokjaemin/EffectiveJAVA development by creating an account on GitHub.

github.com