-
[이펙티브 자바] item 4 - 인스턴스화를 막으려거든 private 생성자를 사용하라개발서적읽기/Effective Java 3E 2020. 6. 10. 01:50
■Static 메서드와 변수만을 담는 클래스는 정말 필요할 때만 사용하자
정적 메서드와 정적 필드만을 담는 클래스는 객체지향에 맞지 않기 때문에
지양하는 것이 좋다. 그러나 꼭 필요한 곳에서는 요긴하게 쓰일 수 있어,
잘 판단해서 사용하면 좋다. 아래와 같은 유틸리티성 클래스를 예로 들 수 있겠다.
- java.lang.Math
- java.lang.Arrays
- java.lang.Collections
final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다.
특정 라이브러리를 사용중이고, 그 라이브러리 내의 클래스에 어떤 메소드를
추가하고 싶을 수가 있다. 이러한 경우엔 그 클래스를 상속한 후 원하는 메소드를
추가하면 된다. 그런데 하필 그 클래스가 final 클래스라면?
상속은 불가능하다. 그럴땐 유틸리티 클래스를 만들듯이 만들고 싶은 메소드를 static하게
만든 후 특정 클래스에 모아놓고 사용하는 것으로 우회할 수 있다.
(그나저나 final의 상속 불가한 이 부분이 OOP에 위반된다고 한다. 출처)
■인스턴스화를 막고자 한다면 반드시 private 생성자를 구현하자
유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니다.
그래서 정적 변수나 메소드만 담게 된다.
그런데 깜빡하고 생성자를 하나도 만들어두지 않으면 컴파일러가 자동으로
기본 생성자를 만들어버린다. 유틸리티 클래스는 인스턴스를 만들어 사용하려고 한
클래스가 아니기 때문에 public 생성자가 만들어 지는 상황을 만들면 안된다.
기본 public 생성자가 만들어지지 않도록 꼭 private 생성자를 만들어두자
혹시라도 유틸리티 클래스를 추상 클래스로 만들어 놓을 생각은 버리자.
유틸리티 클래스를 추상 클래스로 만들면, 상속되어져 인스턴스가 생성될 여지가 생긴다.
■private 생성자를 만들고 그 안에 exception을 생성해 던지자.
public 생성자를 만들지 않고 private 생성자만 만들어 인스턴스화를 할 때,
private 생성자 안에 exception을 생성해서 던지는 코드를 만들어놓으면
내부에서의 생성까지도 막을 수 있고 리플렉션을 통한 외부에서의 생성도 막을 수 있다.
하위 클래스는 무조건 상위 클래스의 생성자를 호출하기 때문에
상속을 불가능하게 만든다는 장점도 있어 더욱 인스턴스화를 막을 수 있다.
'개발서적읽기 > Effective Java 3E' 카테고리의 다른 글
[이펙티브 자바] item 6 - 불필요한 객체 생성을 피하라 (0) 2020.06.22 [이펙티브 자바] item 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) 2020.06.22 [이펙티브 자바] item 3 - private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) 2020.06.01 [이펙티브 자바] item 2 - 생성자에 매개변수가 많다면 빌더를 고려하라 (0) 2020.05.19 [이펙티브 자바] item 1 - 생성자 대신 정적 팩터리 메서드를 고려하라 (0) 2020.05.10 댓글