본문 바로가기

소프트웨어

정적 팩터리 메서드는 생성자보다 좋을까?

반응형

Java 에서 클래스의 객체 인스턴스를 생성하는 방법에는 여러가지가 있지만 가장 기본적으로 쓰이는 방법은 생성자와 new 키워드로 인스턴스를 할당하는 방법이 있습니다

 

그런데 상황에 따라 파라미터의 종류나 갯수가 다를 때에는 어떻게할까요?

생성자를 그냥 여러개 만들면 될까요?

 

이런 상황에서 좋은 방법이 정적 팩터리 메서드인데요

정적 팩터리 메서드는 생성자보다 어떤 점이 좋을까요?

 

생성자는 무조건 클래스와 이름이 같아야하지만 그 외 메서드는 그럴 필요가 없습니다. 정적 팩터리 메서드를 활용하면 메서드에 이름을 따로 부여할 수 있어서 반환될 객체의 특성을 코드를 살펴보지 않고도 이름으로 설명할 수 있습니다.

 

생성자는 호출될 때마다 무조건 새로운 객체 인스턴스를 할당하지만 static 메서드는 그럴 필요가 없습니다. 아래 코드를 보면 Boolean.valueOf(boolean) 메서드에서 객체를 생성하지 않습니다. 같은 객체를 자주 요청하는 상황에서는 성능에 이점이 있을 수도 있죠.

 

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

 

하위 타입 객체를 반환할 수도 있습니다. 반환 타입이 인터페이스일 경우에 그 인터페이스를 구현하고 있다면 어떤 하위 타입도 반환해도 문제가 없습니다.

 

Parameter 에 따라서 매번 다른 타입을 반환할 수도 있습니다. 하위 타입 객체를 반환할 수 있다는 것을 이용하면 되는데요. 입력되는 Parameter 의 크기나 종류 등 요인에 따라서 반환 타입을 다르게 할 수 있습니다. 반환 타입이 하위 타입 혹은 같은 타입이기만 하면 되는거죠.

 

메서드를 작성하는 시점에 반환할 객체의 타입이 없어도 됩니다. 프레임워크를 만드는 근간이 되는 특징인데요. Class 클래스와 Class.forName 메서드를 사용해서 클래스를 동적으로 로딩하면 되겠죠.



그러면 정적 팩터리 메서드는 생성자보다 무조건 좋을까요..? 생성자가 더 적절한 경우도 있습니다.



상속을 하려면 public 혹은 protected 접근제어자로 접근제어 처리된 생성자가 필요합니다. 상속을 하기 위해서는 정적 팩터리 메서드만 있거나 private 생성자만 있으면 안됩니다. (물론 같은 패키지라면 default 생성자가 있어도 상속 가능합니다)

 

new 키워드와 생성자로 인스턴스를 생성하는 것은 모든 개발자가 알고 있겠지만 정적 팩터리 메서드는 클래스마다 다르므로 개발자가 찾아야 합니다. 그래서 정적 팩터리 메서드를 사용하고자 한다면 널리 알려진 명명 방식을 사용하는게 좋겠죠.

 

여태까지 거의 무작정 생성자를 만들었는데 그리 좋지 않은 방법이군요. 정적 팩터리 메서드를 만들어 사용했어도 이게 정적 팩터리 메서드인지 모르는 채로 사용했구요. 앞으로는 알고 사용하면 더 좋겠습니다 :)

 

 

참고

이펙티브 자바 Effective Java 3/E

http://www.yes24.com/Product/Goods/65551284?OzSrank=1

반응형