Home [Effective Java] Item01. 생성자 대신 정적 팩터리 메서드를 고려하라!
Post
Cancel

[Effective Java] Item01. 생성자 대신 정적 팩터리 메서드를 고려하라!

Item01. 생성자 대신 정적 팩터리 메서드를 고려하라!

2장은 전반적으로 객체의 생성/파괴를 다룬다. 객체를 만들어야할 때와 아닐 때를 구분하는 법, 객체의 생성 방법이나 파괴 시 할 작업 등에 대해 배운다고 볼 수 있다.

  • 클래스의 인스턴스를 얻는 전통적 수단 : public 생성자 -> 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다.

public 생성자와 비교 시, 정적 팩터리 메서드가 갖는 장점

  1. 이름을 가질 수 있다.
    • 생성자보다 더 직관적인 의미전달이 가능하다. 이는 생성자가 어떤 역할을 하는지 정확히 기억하지 못하는 경우를 피할 수 있게 한다.
  2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
    • 불변클래스의 경우 인스턴스를 미리 생성하거나 캐싱 및 재활용하여 불필요한 객체 생성을 줄인다.
    • 생성 비용이 큰 객체를 자주 요청하는 경우라면 상당한 성능 향상을 보일 것이다.
    • 언제 어느 인스턴스를 살아있게 할 것인지 결정하는 인스턴스 통제(1)가 잘 이뤄지는 클래스의 성질을 갖는다.
  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
    • 반환 객체의 클래스를 자유롭게 선택하는 것이 가능해짐 -> “유연성 향상”
    • API 생성 시 구현 클래스 공개 없이 객체 반환 가능 -> API 작게 유지 가능(예로 Collections API를 생각해보자)
    • API를 작게 유지할수록 사용자의 편의성 향상된다 볼 수 있다.
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
    • 조건에 따라 내부 로직이 달라질 수 있다. 하지만 정적 팩터리 메서드가 갖는 특징(하위 타입 객체 반환 가능) 덕분에 반환에 유연성이 생긴다.
  5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
    • 이러한 유연함은 서비스 제공자 프레임워크(2)의 근간이 된다.

public 생성자와 비교 시, 정적 팩터리 메서드가 갖는 단점

  1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.

참고

  1. 인스턴스 통제의 이유?

    1. 클래스를 싱글턴으로 만들 수 있다.
    2. 불변 값 클래스에서 동치인 인스턴스가 하나뿐임을 보장할 수 있다.
  2. 서비스 제공자 프레임워크란?

    1. 제공자는 서비스의 구현체이다. 이 구현체들을 프레임워크가 통제하고, 클라이언트와 분리시킨다.
    2. 3개의 핵심 컴포넌트로 나뉜다.
      1. 서비스 인터페이스 : 구현체의 동작 정의
      2. 제공자 등록 API : 제공자가 구현체를 등록 시 사용
      3. 서비스 접근 API : 클라이언트가 서비스의 인스턴스를 얻을 때 사용
This post is licensed under younghwani by the author.

[Env] 자바 버전 변경

[Effective Java] Item02. 생성자에 매개변수가 많다면 빌더를 고려하라!

Comments powered by Disqus.