[공부한 것] 정적 팩토리 메소드 사용하는 이유가 확실하니?

별의개발자커비·2023년 10월 31일
1

우테코 도전기

목록 보기
23/37

개요

그동안 객체를 생성할 때 from, of 등의 정적 팩토리 메소드를 사용하는 방법을 썼다.
그렇게 한 이유는? 캡슐화하면 좋으니까! 이 생각만 갖고 있었던 것 같다.
하지만 이러한 리뷰를 보고나니, 캡슐화라는 이유만 있어도 되는 걸까?싶으면서 무지성(?)으로 사용한 것 같다는 생각이 들어 정리해보려고 한다!


정적 팩토리 메소드란?

직접적으로 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해서 객체를 생성하는 것을 말한다.

정적 팩토리 메소드로 객체 생성

    Ball ball = Ball.of(position, number);

------------------------------------------------
    
    private Ball(int position, int number) {
        this.number = number;
        this.position = position;
    }
    
    public static Ball of(int position, int number) {
        return new Ball(position, number);
    }

생성자로 직접 객체 생성

    Ball ball = new Ball(position, number);

------------------------------------------------
    
    public Ball(int position, int number) {
        this.number = number;
        this.position = position;
    } 

사용하는 이유?

우선 지금까지 내가 느낀 장점은 아래와 같다!

  1. 객체 생성을 캡슐화할 수 있다.
    • 생성자를 클래스의 메서드 안으로 숨기면서 내부 상태를 외부에 드러내지 않을 수 있게된다.
  2. 이름을 가질 수 있다.
    • 생성 목적과 과정에 따라 이름, 파라미터를 다르게 받아 생성자를 구별해서 사용할 수 있다.
  3. 파라미터에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
  4. 호출할 때마다 새로운 객체를 생성할 필요가 없다.
    • 아직 필요성을 느끼지는 못했다.

이펙티브 자바의 첫번째 아이템 - “생성자 대신 정적 팩토리 메서드를 고려하라”


단점은?

  1. 상속이 불가능하다
    • 상속에는 pulic 혹은 protected 생성자가 필요하므로 정적 팩토리 메서드만 제공할 경우 상속이 불가능하다.
  2. 정적 팩토리 메서드를 다른 개발자들이 찾기 어렵다.
    • 개발자가 임의로 만든 정적 팩토리 메서드 특성 상, 다른 개발자들이 사용시에 정퍽 팩토리 메서드를 찾기가 어렵다고 생각 할 수 있다.

정적 팩토리 메소드 네이밍 컨벤션

  • 참고글 발췌

참고한 글 : tecoble - 정적 팩토리 메서드(Static Factory Method)는 왜 사용할까?


팩토리 메서드?

정적 팩토리 메서드에 대해서 알아보다 보니 팩토리 메서드는 뭐지? 싶어서 찾아봤다!
우리의 위키백과에 따르면 팩토리 메서드 패턴은,
1. 부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며.
2. 자식 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다.
3. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.

즉, 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 하는 패턴이라고 할 수 있다.

단점이라면, 패턴 구현에 의한 코드가 복잡해질 수 있다는 점이 있다.

사실 오히려 그냥 팩토리 메서드가 아직 더 이해가 안간다. 참고할만한 글을 남기고 천천히 이해해보려고 한다.

https://velog.io/@ljo_0920/팩토리-메서드
https://refactoring.guru/ko/design-patterns/factory-method

0개의 댓글