728x90
SMALL
목적
- 책 읽고 정리하자!
- 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때 활용할 수 있는 방법을 알아보자.
- private 생성자의 활용법 한 가지를 알아보자.
인스턴스화를 막는 작업이 필요한 상황
아래와 같은 클래스들은 정적 메서드와 정적 필드만을 담은 유틸리티 클래스들로 볼 수 있다.
java.lang.Math
- 수학적인 연산과 함수를 제공하는 유틸리티 클래스java.util.Arrays
- 배열을 다루기 위한 다양한 유용한 메서드들을 제공java.util.Collections
- 다양한 유형의 컬렉션(자료구조)을 조작하고, 정렬하고, 검색하는 데 도움을 주는 메서드들을 제공
이와 같은 유틸리티 클래스들은
기본 타입 값이나 배열 관련 메서드들을 모아놓거나,
특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리)를 모아놓을 수도 있고
final 클래스와 관련한 메서드들을 모아놓을 때도 사용하는 등의
나름의 쓰임새가 있다.
이러한 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰게끔 설계되지 않았다.
다만 클래스는 생성자를 명시하지 않으면
기본 public 생성자가 만들어지기 때문에
인스턴스화를 막는 작업을 하지 않는다면 의도치 않는 상황이 생길 수 있다.
추상 클래스로 만들어 인스턴스화를 막을 수 있을까?
답은 막을 수 없다.
추상 클래스를 상속받아 하위 클래스를 만들고 인스턴스화를 하면 되기 때문이다.
또한 추상 클래스로 클래스를 설계하면
사용자가 해당 클래스를 상속해서 사용해야 한다고 오해를 할 수 있다.
인스턴스화 막기 - private 생성자를 추가하자.
private 생성자를 추가하면 public 생성자가 자동으로 만들어지는 상황을 막을 수 있기 때문에
인스턴스화를 막을 수 있게 된다.
public class Utility { private Utility(){ // 인스턴스 방지용 - 기본 생성자가 만들어지는 것을 막는다 throw new AssertionError(); } }
체크사항
- 클래스안에서 실수로라도 생성자를 호출하지 않도록 Exception을 던진다
- 직관적으로 알아볼 수 있도록 주석을 달아주도록 하자
추가 장점
- 상속도 막아줄 수 있다.
모든 생성자는 상위클래스의 생성자를 호출한다.
private로 선언하면 하위 클래스가 상위 클래스의 생성자에 접근할 수 있는 길을 막을 수 있다.
요약
- 인스턴스화를 막고 싶은 상황이 있을 수 있다. 이럴 때 private 생성자를 이용하자.
728x90
LIST
'Language > JAVA' 카테고리의 다른 글
[Effective Java] private 생성자와 열거 타입으로 싱글턴 보증하기 (0) | 2023.08.10 |
---|---|
[JAVA][자료구조] Stack (0) | 2023.08.09 |
[JAVA][자료구조] Queue (0) | 2023.08.09 |
[Effective java] 정적 팩터리 메서드 (0) | 2023.07.29 |
[JAVA] Comparator, Comparable을 이용해서 배열과 List를 정렬하자. (0) | 2023.07.28 |