1-1. 생성자 대신 정적 팩토리 메서드

cotchan·2021년 9월 6일
0
  • 아래 출처를 통해 작성한 글입니다.
  • 개인 공부 목적으로 작성한 글입니다.

1. Intro

  • 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자입니다.
  • 클래스는 생성자와 별도로 정적 팩토리 메서드를 제공할 수 있습니다.
    • 정적 팩토리 메서드란, 그 클래스의 인스턴스를 반환하는 정적 메서드를 말합니다.

2. 정적 팩토리 메서드 장단점


2-1. 장점 (5가지)

  1. 이름을 가질 수 있다.

    • 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있습니다.
  2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.

    • 이 덕분에 불변 클래스는 인스턴스를 미리 만들어놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있습니다.
      public static Boolean valueOf(boolean b) { 
          return b ? Boolean.TRUE : Boolean.FALSE;
      }
    • 반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩토리 방식의 클래스는 언제 어느 인스턴스를 살아 있게 할지를 통제할 수 있습니다.
  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있습니다.

    • 이 능력은 반환할 객체의 클래스를 자유롭게 선택할 수 있게 하는 '유연성'을 선물합니다.
    • API를 만들 때 이 유연성을 응용하면 구현 클래스를 공개하지 않고도 그 객체를 반환할 수 있어 API를 작게 유지할 수 있습니다.
      • ex. Collection Frameworks
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있습니다.

    • 반환 타입의 하위 타입이기만 하면 어떤 클래스의 객체를 반환하든 상관없다는 뜻입니다.
      • ex.
        • EnumSet 클래스는 public 생성자 없이 오직 정적 팩토리만 제공하는데, OpenJDK에서는 원소의 수에 따라 두 가지 하위 클래스 중 하나의 인스턴스를 반환합니다.
  1. 정적 팩토리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 됩니다.

2-2. 단점 (2가지)

  1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩토리 메서드만 제공하면 하위 클래스를 만들 수 없습니다.

  2. 정적 팩토리 메서드는 프로그래머가 찾기 어렵습니다.

    • 생성자처럼 API 설명에 명확히 드러나지 않으니 사용자는 정적 팩토리 메서드 방식 클래스를 인스턴스화할 방법을 알아내야 합니다.

3. 대표 명명 방식

  • from
    • 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드
    Date date = Date.from(instant);
  • of
    • 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 집계 메서드
    Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
  • valueOf
    • from과 of의 더 자세한 버전
    BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
  • instance 또는 getInstance
    • (매개변수를 받는다면) 매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 보장하지는 않습니다.
  • create 혹은 newInstance
    • instance 혹은 getInstance와 같지만, 매번 새로운 인스턴스를 생성해 반환하는 것을 보장합니다.
  • getType
    • getInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩토리 메서드를 정의할 때 사용합니다.
    • Type은 팩토리 메서드가 반환할 객체의 타입입니다.
    FileStore fs = Files.getFileStore(path);

  • 출처
    • Joshua Bloch, 『EFFECTIVE JAVA 3/E』, 개앞맵시 옮김, 프로그래밍인사이트(2018)
profile
https://github.com/cotchan

0개의 댓글