From f6277a8f8bdfc0858ac963189df749bd6464c148 Mon Sep 17 00:00:00 2001 From: xorwns118 Date: Tue, 20 Aug 2024 10:55:03 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=2020240814=5F=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=5F=EA=B9=80=ED=83=9D=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_posts/2024-08-14-StaticFactoryMethod.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 "\352\270\260\354\210\240\354\204\270\353\257\270\353\202\230/_posts/2024-08-14-StaticFactoryMethod.md" diff --git "a/\352\270\260\354\210\240\354\204\270\353\257\270\353\202\230/_posts/2024-08-14-StaticFactoryMethod.md" "b/\352\270\260\354\210\240\354\204\270\353\257\270\353\202\230/_posts/2024-08-14-StaticFactoryMethod.md" new file mode 100644 index 0000000..3fecc32 --- /dev/null +++ "b/\352\270\260\354\210\240\354\204\270\353\257\270\353\202\230/_posts/2024-08-14-StaticFactoryMethod.md" @@ -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 + +--- + +## 정적 팩토리 메서드 패턴이란? +지금까지 객체를 인스턴스화 할 때 직접적으로 생성자를 호출하고 생성했는데, 이와는 반대로 객체 생성 역할을 하는 메서드를 통해 간접적으로 객체 생성을 유도하는 것이 `정적 팩토리 메서드 패턴`이다.

+조슈아 블로크의 **이펙티브 자바**에서 소개하는 아이템 중에서 첫 번째로 조언 하는것이 '생성자 대신 정적 팩토리 메서드를 고려하라' 인데, 왜 이렇게 한단계 더 거쳐서 정적팩토리 메서드를 통해 객체를 생성하라는 것인가에 대해 그 장점과 단점을 알아보자. + +## 정적 팩토리 메서드의 장점 +### 1. 생성 목적에 따라 네이밍이 가능하다. +지금까지는 다양한 타입의 객체를 생성할 때, 생성 목적에 따라 생성자를 오버로딩하여 구분하고 사용해왔다.

+이렇게 하면 다른 사람과의 협업에서 개발자가 객체를 초기화 시키고 생성자로 생성할 때 생성자의 인자 순서와 내부 구조를 알고 있어야 목적에 맞게 객체를 생성할 수 있는데, +이렇게 작성했을 때 클래스 이름으로 고정되어있는 탓에 코드의 가독성은 현저하게 떨어질 것이다.

+따라서, `정적 팩토리 메서드`를 통해 적절한 메서드 네이밍을 해 준다면 객체의 목적이 무엇인가에 대해 한번에 유추할 수 있게 된다.(물론 네이밍 잘해야 함) + + +### 2. 인자에 따라 다른 객체를 반환하도록 분기할 수 있다. +메서드이니 매개변수를 받을수 있을테고, 메서드 블록 내에서 분기문을 통해 여러 자식 타입의 인스턴스를 반환하도록 응용 구성이 가능하다 + +### 3. 객체 생성을 캡슐화 할 수 있다. +생성자를 사용하는 경우 외부에 내부 구조를 드러내야 하는데, `정적 팩토리 메서드`의 경우 간접적으로 호출되기 때문에 외부로부터 숨길 수 있어 캡슐화 할 수 있다는 특징이 있다. +또한, 정보 은닉성을 가지는 동시에 의존성을 제거해 주는 장점도 지니고 있다. + +### 4. 불필요한 객체 생성을 막을 수 있다. +2번과 같이 매개변수가 정해져있는 여러 자식 타입이 있고 그 목적에 맞는 메서드를 사용할 때 반환해야 할 객체만을 생성하기에 불필요한 객체가 생겨날 수 없다. + +## 정적 팩토리 메서드 패턴의 단점 +### 1. 상속을 이용한 확장이 불가능하다. +정적 팩토리 메서드로 클래스를 설계하면 생성자를 private 하게 설정하게 되는데 이 때문에 상속을 이용한 확장이 불가능해진다.
+하지만 정적 팩토리 메서드는 상속보단 합성을 사용하게끔 유도한다거나, 불변 객체로 만들고 싶을 때 사용되는 패턴이기에 단점보단 특징에 가까울 수 있다. + +### 2. API 문서의 불편함 +개발자가 임의로 만든 메서드이기에, 무슨 메서드인지 직접 찾아가서 이해해야한다.
+따라서 네이밍 컨벤션을 지키고 명확한 목적을 명시해야 한다. + +네이밍 컨벤션 참고 => https://docs.oracle.com/javase%2Ftutorial%2F/datetime/overview/naming.html