Skip to content

Commit

Permalink
feat : 20240814_정적 팩토리 메서드 패턴_김택준
Browse files Browse the repository at this point in the history
  • Loading branch information
xorwns118 committed Aug 20, 2024
1 parent e03ce23 commit f6277a8
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions 기술세미나/_posts/2024-08-14-StaticFactoryMethod.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@

---
layout: post
title: `정적 팩토리 메서드 패턴`
author: `김택준`
categories: `기술세미나`
banner:
image: `assets/images/post/2023-11-05.webp`
background: "#000"
height: "100vh"
min_height: "38vh"
heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline"
tags: [`정적 팩토리 메서드 패턴`, `static`, `factory method pattern`]
---

# Static Factory Method Pattern

---

## 정적 팩토리 메서드 패턴이란?
지금까지 객체를 인스턴스화 할 때 직접적으로 생성자를 호출하고 생성했는데, 이와는 반대로 객체 생성 역할을 하는 메서드를 통해 간접적으로 객체 생성을 유도하는 것이 `정적 팩토리 메서드 패턴`이다.<br><br>
조슈아 블로크의 **이펙티브 자바**에서 소개하는 아이템 중에서 첫 번째로 조언 하는것이 '생성자 대신 정적 팩토리 메서드를 고려하라' 인데, 왜 이렇게 한단계 더 거쳐서 정적팩토리 메서드를 통해 객체를 생성하라는 것인가에 대해 그 장점과 단점을 알아보자.

## 정적 팩토리 메서드의 장점
### 1. 생성 목적에 따라 네이밍이 가능하다.
지금까지는 다양한 타입의 객체를 생성할 때, 생성 목적에 따라 생성자를 오버로딩하여 구분하고 사용해왔다.<br><br>
이렇게 하면 다른 사람과의 협업에서 개발자가 객체를 초기화 시키고 생성자로 생성할 때 생성자의 인자 순서와 내부 구조를 알고 있어야 목적에 맞게 객체를 생성할 수 있는데,
이렇게 작성했을 때 클래스 이름으로 고정되어있는 탓에 코드의 가독성은 현저하게 떨어질 것이다.<br><br>
따라서, `정적 팩토리 메서드`를 통해 적절한 메서드 네이밍을 해 준다면 객체의 목적이 무엇인가에 대해 한번에 유추할 수 있게 된다.(물론 네이밍 잘해야 함)


### 2. 인자에 따라 다른 객체를 반환하도록 분기할 수 있다.
메서드이니 매개변수를 받을수 있을테고, 메서드 블록 내에서 분기문을 통해 여러 자식 타입의 인스턴스를 반환하도록 응용 구성이 가능하다

### 3. 객체 생성을 캡슐화 할 수 있다.
생성자를 사용하는 경우 외부에 내부 구조를 드러내야 하는데, `정적 팩토리 메서드`의 경우 간접적으로 호출되기 때문에 외부로부터 숨길 수 있어 캡슐화 할 수 있다는 특징이 있다.
또한, 정보 은닉성을 가지는 동시에 의존성을 제거해 주는 장점도 지니고 있다.

### 4. 불필요한 객체 생성을 막을 수 있다.
2번과 같이 매개변수가 정해져있는 여러 자식 타입이 있고 그 목적에 맞는 메서드를 사용할 때 반환해야 할 객체만을 생성하기에 불필요한 객체가 생겨날 수 없다.

## 정적 팩토리 메서드 패턴의 단점
### 1. 상속을 이용한 확장이 불가능하다.
정적 팩토리 메서드로 클래스를 설계하면 생성자를 private 하게 설정하게 되는데 이 때문에 상속을 이용한 확장이 불가능해진다.<br>
하지만 정적 팩토리 메서드는 상속보단 합성을 사용하게끔 유도한다거나, 불변 객체로 만들고 싶을 때 사용되는 패턴이기에 단점보단 특징에 가까울 수 있다.

### 2. API 문서의 불편함
개발자가 임의로 만든 메서드이기에, 무슨 메서드인지 직접 찾아가서 이해해야한다.<br>
따라서 네이밍 컨벤션을 지키고 명확한 목적을 명시해야 한다.

네이밍 컨벤션 참고 => https://docs.oracle.com/javase%2Ftutorial%2F/datetime/overview/naming.html

0 comments on commit f6277a8

Please sign in to comment.