본문 바로가기
JAVA

정적 팩토리 메서드의 장단점

by 다미르 2019. 4. 7.

클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자
보통 Class myClass = new Class(); 이런식으로 인스턴스하여 객체 참조값을 받아서 사용한다.
이런 생성자 대신 정적 팩토리 메서드를 사용할 때 이점을 알아보자.

정적 패토리 메서드

클래스는 클라이언트에 public 생성자 대신 정적 팩토리 메서드를 제공할 수 있다.
밑에 잡소리가 길지만 한 마디로 요약하자면
정적 팩토리 메서드의 장점은 '유연성'


  1. 1 이름을 가질 수 있다
    • 정적팩토리 메서드는 이름을 통해서 반환하는 객체가 무엇인지 직관적으로 나타낼 수 있다.
    • ex) 'BigInteger.probablePrime()' -> 값이 소수인 BigInteger를 반환한다는 것을 더 잘 표현
  2. 2 호출 시 인스턴스를 새로 생성할 필요가 없다
    • 불변 클래스는 인스턴스를 미리 만들어 놓거나
    • 새로 생성한 인스턴스를 캐싱하여 재사용한다
  3. 3 반환 타입의 하위 타입 객체를 반환할 수 있다.
    • 반환할 객체의 클래스를 자유롭게 선택할 수 있어 유연성을 제공한다.
    • 구현 클래스를 공개하지 않고도 그 객체를 반환할 수 있어서 API를 작게 유지할 수 있다.
    • ex) java.util.Collections의 정적 팩토리 메서드를 통해서만 45개의 유틸리티 구현체의 인스턴스를 반환
    • 클라이언트에서 사용할 때 구현 클래스를 생각할 필요없이 인터페이스 형태로 받아서 사용
  4. 4 입력 매개변수에 따라 다른 객체를 반환할 수 있다.
    • 반환 타입의 하위 타입의 객체라면 사실 어느 것이든 반환할 수 있다.
    • 가령 EnumSet 객체는 원소가 64개 이하면 long 변수 하나로 관리되는 RegularEnumSet 인스턴스를 반환
    • 65개 이상이면 long 배열로 관리하는 JumboEnumSet의 인스턴스를 반환한다고 한다.
    • 이런 장점 때문에 클라이언트는 팩토리 메서드가 전해주는 인스턴스가 무엇인지 알 필요가 없다.
    • 나중에 RegularEnumSet의 이점이 사라져 삭제해도 되고, 다른 객체를 추가해도 문제가 되지 않는다.
  5. 5 정적 팩토리 메서드를 작성하는 시점에 반환할 객체의 클래스가 없어도 된다.
    • 서비스 제공자 프레임워크의 근본이 되는 개념
      • 서비스 제공자 프레임워크의 구성요소
      • 서비스 인터페이스 : 구현체의 동작을 정의
      • 제공자 등록 API : 제공자가 구현체를 등록할 때 사용하는
      • 서비스 접근 API : 클라이언트가 서비스의 인스턴스를 얻을 때 사용
    • ex) JDBC(Java Database Connection)
      • java 쪽에서 인터페이스와 제공자 등록 API를 각 DB사(oracle, mysql, mssql etc..)에 제시
      • DB사(제공자)는 그것에 맞추어 드라이버를 구현하여 등록(JDBC)
      • 자바 개발자들은 서비스 접근 API를 사용하여 드라이버 사용
      • Connection -> 서비스 인터페이스
      • DriverManager.registerDriver -> 제공자 등록 API
      • DriverManager.getConnection() -> 서비스 접근 API
    • 구현체를 클라이언트에 제공하는 역활을 프레임워크가 수행, 클라이언트와 구현체를 분리

단점도 물론 존재한다.

  1. 상속을 위해서는 public 혹은 protected 생성자가 필요
    • 정적 팩토리 메서드만 제공하면 하위 클래스를 만들 수 없다.
    • 즉, 앞서 예시로 든 Collections 객체의 하위 클래스를 생성할 수 없다
  2. 개발자가 정적 팩토리 메서드를 찾기 어렵다.
    • 이 문제를 보완하려면 정적 팩토리 메서드 이름을 잘 지어야한다.
    • ex) getInstance() : 누가봐도 인스턴스를 반환하는 정적 팩토리 메서드지 않은가?

'JAVA' 카테고리의 다른 글

컴포지션(Composition)  (0) 2019.04.28
싱글톤  (0) 2019.04.15
빌더 패턴!  (0) 2019.04.08