Coding Log



Advanced Java

Static Factory Method (1) - Naming

Class를 통해 객체를 만드는 가장 일반적인 방법은 Constructor(생성자)를 통해 만드는 것이다.

허나 이런 일반적인 방법이 아닌 Static Factory Method(정적 팩토리 메소드) 를 추가하여 객체를 생성하는 방법도 존재한다.

참고 Design Pattern에서 얘기하는 Factory Method 패턴의 개념과는 다르다.

아래의 코드를 보자.

public static Boolean valueOf(boolean b) {
  return b ? Boolean.TRUE : Boolean.False;
}

위의 코드는 valueOf 메소드를 통해 변수 boolean을 Boolean 객체에 대한 참조로 변환한다.

예제와 같이 public으로 선언된 정적 팩토리 메소드를 제공하면서 얻는 이점은 다음과 같다.

  • 생성자는 이름이 정해져 있지만 정적 팩토리 메소드에는 메소드명을 자유롭게 쓸 수 있다.
  • 생성자와는 달리 호출할 때마다 새로운 객체를 생성하지 않는다.
  • Return Type을 가질 수 있어서 특정 객체나 자료형을 반환할 수 있다.
  • Parameterized Type 객체를 편하게 만들 수 있다.

이 4가지 장점을 하나씩 살펴보자.

정적 팩토리 메소드는 메소드명을 자유롭게 쓸 수 있다.

/// CLASS_NAME.java

public CLASS_NAME(params ...) {
  // body
}

위의 예시코드에서 보듯 생성자는 이름이 정해져있어 특정 의미를 가지기가 힘들다.

parameter 부분을 좀 더 자세히 바꿔보자.

/// CLASS_NAME.java

public CLASS_NAME(int i, String s, float f) {
  // body
}

세 가지 parameter가 필요한 생성자라는 의미는 알겠지만 이 parameter들이 왜 필요한지, 어떤 역할을 하는지는 알 수가 없다.

반면 정적 팩토리 메소드는 메소드명을 자유롭게 지정할 수 있기때문에 이름에 의미를 부여할 수 있다.

이는 코드의 가독성 을 올려주는 역할을 한다.

실제 java에서 제공하는 Integer 라는 클래스가 있다.

정수를 표현하는 int 를 박싱한 Wrapper 클래스인데 여기에도 정적 팩토리 메소드가 있다.

참고 Integer Document

이 Integer에는 2개의 생성자가 있다. 아래 코드를 통해 확인해보자.

// Constructs a newly allocated Integer object that represents the specified
// int value.
Integer(int value);

// Constructs a newly allocated Integer object that represents the int value
// indicated by the String parameter.
Integer(String s);

int나 String 타입의 parameter를 통해 만든 Integer객체로 무엇을 한다는 것일까?

생성자 하나로는 아무것도 파악할 수가 없다.

Integer 클래스 안에 정의되어있는 정적 팩토리 메소드를 보자.

// Decodes a String into an Integer.
public static Integer decode(String nm) {
  // body
}

// Determines the integer value of the system property with the specified name.
public static Integer getInteger(String nm) {
  // body
}

// Returns an Integer instance representing the specified int value.
public static Integer valueOf(int i) {
  // body
}

위의 정적 팩토리 메소드를 사용하면 String 값을 통해 Integer값을 디코딩하고 싶은 건지, 시스템에 등록된 속성값을 가져오려는 건지, String값에 저장된 Integer객체를 추출할지 명시적으로 사용할 수 있다.

DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다