본문 바로가기
IT KNOWLEDGE

정적 팩토리 메서드(Static Factory Method)

by BTC_동동 2023. 8. 4.

베하

안녕하세요 여러분. 일단고입니다.

java라는 언어는 너무 많이 사용하는 언어이자 어려운 언어라고 생각이 듭니다. 하지만 Java를 땔 수 없는 저의 상황입니다…

오늘 얘기해볼 주제는 Java 언어의 정적 팩토리 메서드(Static Factory Method)에 대해 알아보겠습니다.

 

1. 정적 팩토리 메서드란?

Java라는 언어를 경험을 해본신 분이라면 아마 new 라는 키워드를 모두 알고 있을 것 같습니다.

java는 객체지향언어로 new 라는 키워드를 통해서 객체를 생성하고 사용합니다. 이러한 객체 생성 방식을 new 키워드가 아닌 우리가 흔히 아는 메서드 즉, 함수로 객체를 생성하게 하는것을 정적 팩토리 메서드라고 합니다.

현업에서는 우리가 java언어를 배울 때 new 키워드로 객체를 생성했던 방식은 사용하지 않을 뿐 아니라 프로덕트 환경에서는 정적 팩토리 메서드 방식의 객체 생성을 지향하고 있습니다.

static 이라는 키워드로 클래스 메서드를 통해서 객체의 생성을 하는것을 정적 팩토리 메서드라고 볼 수 있습니다.

 

2. 왜 정적 팩토리 메서드?

new라는 쉽고 직관적인 키워드가 있음에도 불구하고 정적 팩토리 메서드를 사용하는 이유는 여러가지가 있습니다.

2.1 객체 생성에 있어 명확한 목적 및 명칭을 알 수 있습니다

public class Laptop {
    private String company;
    private String color;
    private Laptop(String company, String color){
        this.company = company;
        this.color = color;
    }

    // 정적 펙토리 메서드 드간다~
    public static Laptop samsungLaptopFrom(String color){
        return new Laptop("samsung",color);
    }
    public static Laptop appleLaptopFrom(String color){
        return new Laptop("apple",color);
    }
    public static Laptop laptopOf(String company, String color){
        return new Laptop(company,color);
    }
}
public class Main {
    public static void main(String[] args) {
        Laptop samsung = Laptop.samsungLaptopFrom("black");
        Laptop apple = Laptop.appleLaptopFrom("silver");
        Laptop laptop = Laptop.laptopOf("LG","white");
        samsung.toString();
    }
}

위 코드에서 객체를 생성할 때 명확하개 객체 생성의 내용과 목적을 알 수 있습니다.

 

2.2 필요한 객체를 미리 정의하여 호출할 때 선택할 수 있습니다.

public class Settings {
    private Settings() {}

    private static class SettingsHolder {
        public static final Settings SETTINGS = new Settings();
    }

    public static Settings getInstance() {
        return SettingsHolder.SETTINGS;
    }
}

다음과 같은 싱글톤 패턴에서 미리 객체를 정의하여 지속적으로 재사용할 수 있도록 할 때 사용됩니다.

 

2.3 하위 자료형 객체를 반환할 수 있습니다.

java는 상속이라는 개념이 있습니다. 상황에 따라 하위 클래스 또는 상위 클래스 타입의 반환에 유연할 수 있습니다.

interface Computer{}

class GalaxyBook implements Computer{}
class MacBook implements Computer{};
class Gram implements Computer{};

public class Laptop {
    public static Computer getGalaxyBook() {
        return new GalaxyBook();
    }

    public static Computer getMacBook() {
        return new MacBook();
    }

    public static Computer getGram() {
        return new Gram();
    }
}

Laptop 클래스는 네이밍을 가지고 여러 하위 클래스들을 반환할 수 있습니다.

이러한 기능을 이용하면 메서드의 기능에서 인자, 오버로딩과 같은 방식으로 마치 동적인 객체 생성으로 상위, 하위 타입의 객체 반환도 가능합니다.

 

 

위 내용 외에도 정적 팩토리 메서드를 통해 이루고자 하는 목적은 상당히 많고 응용할 수 있는 영역도 많이 존재합니다. (추가적으로 공부해보겠습니다!)

 

3. 정적 팩토리 메서드 이름 만들기

정적 팩토리 메서드의 이름을 만들 때 변수 네이밍룰이 존재하듯이 암묵적인 룰이 존재합니다.

  • from : 하나의 매개변수를 통해 객체를 반환하는 형변환 메서드
  • of : 여러 매개변수를 받거나 여러 매개변수로 부터 조건에 따른 객체 반환할 때
  • getInstance : 매개변수가 있다면 명시한 인스턴스를 반환, 없다면 참조하려는 type과 일치. 단, 같은 인스턴스임을 보장 하지 않음
  • newInstance : getInstance는 싱글톤 패턴으로 하나의 객체를 반환한다면 newInstance는 싱글톤 패턴을 보장하지 않는 객체반환이라 생각하면 됩니다.

물론 위의 네이밍룰은 위처럼 하지 않는다고 컴파일 에러가 발생하지는 않습니다. 또한 네이밍룰은 조직 혹은 개인이 생각하는 클린코드에 해당한다면 언제든지 무엇이든지 될 수 있습니다.

 

 

오늘은 이렇게 정적 팩토리 메서드에 대해 알아보았습니다.

날이 많이 덥고 휴가철에 모두 건강조심하세요~~

 

'IT KNOWLEDGE' 카테고리의 다른 글

정렬 알고리즘 개념  (0) 2023.08.14
SSO, OAuth, OIDC 그리고 SAML  (0) 2023.08.04
[Youtube API] YouTube Data API v3 개요  (0) 2023.08.03
Keycloak과 Grafana 연동  (0) 2023.07.21
Translation LLM 실습  (0) 2023.07.21

댓글