Programs/Java
객체의 생성과 소멸 - 1. 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자.
outliers
2012. 10. 29. 11:17
Effect Java 제2판(Joshua Bloch / Addison Wesley) 을 공부하고 정리한 내용 입니다.
1. 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자.
장점
- 생성자와 다릴 자기 나름의 이름을 가질 수 있다는 것이다. 만일 생성자에 전달되는 매개변수가 반환 객체를 잘 나타내지 못한다면, 이름을 잘 지은 static 팩토리 메소드가 더 사용하기 쉬우며, 이 메소드를 호출하는 클라이언트 코드도 이해하기 쉽다.
자바 클래스는 동일한 시그니처를 갖는 생성자를 하나만 가질 수 있다. 이런 제약을 해결하기 위해 타입이 다른 매개변수의 순서만을 바꾸어 두 개의 생성자로 만든다. 이 방법은 좋지 않다. 필요한 생성자가 어떤 것인지 기억하기도 어렵고, 실수로 다른 생성자를 호출 할 수도 있기 때문이다. 또한 그런 생성자를 사용하는 코드를 파악하려는 사람들은 문서를 봐야만 이해할 수 있다.
하나의 클래스에 동일한 시그니처를 갖는 여러 개의 생성자가 필요한 경우에는 생성자 대신 static 팩토리 메소드를 사용하되, 메소드 간의 차이점을 부각시키도록 신중하게 이름을 선정한다. - 생성자와 달리 호출될 때마다 매번 새로운 객체를 생성할 필요가 없다는 것이다. 따라서 불변(immutable)클래스의 경우 이미 생성된 인스턴스를 다시 사용할 수 있으며, 불필요하게 중복된 인스턴스들이 생성되는 것을 방지하기 위해 이미 생성된 인스턴스들을 저장했다가 반복 사용할 수 있다.
동일한 객체가 자주 사용될 때 특히 객체 생성 시 자원이나 시간이 많이 든다면 프로그램 성능을 크게 향상시킬 수 있다.
static 팩토리 메소드는 여러 번 호출되더라도 이미 생성된 동일 객체를 반환할 수 있으므로, 클래스에서는 언제든지 인스턴스들의 존재를 직접 제어 할 수 있다. 이런 일을 하는 클래스를 인서튼스 제어(instance-coltrolled) 클래스라고 한다. 인스턴스를 제어하면 싱글톤, 인스턴스 생성 불가 클래스로 만들 수 있다. 불변 클래스에서 두 개의 동일한 인스턴스가 생기지 않도록 해준다. 클래스에서 이것을 보장해 준다면 인스턴스의 동일 여부를 확인할 때 equals(Object) 메소드 대신 == 연산자를 사용할 수 있으므로 프로그램 성능도 향상될 수 있다. 열거형(enum)에서는 이것을 보장하고 있다. - 자신의 클래스 인스턴스만 반환하는 생성자와 달리, static 팩토리 메소드는 자신이 반환하는 타입의 어떤 서브타입(subtype) 객체도 반환할 수 있다. 따라서 반환되는 객체의 클래스를 선택해야 할 때 뛰어난 유연성을 제공한다.
- 매개변수화 타입(parameterized type)의 인스턴스를 생성하는 코드를 간결하게 해준다는 것이다.
단점
- 인스턴스 생성을 위해 static 팩토리 메소드만 갖고 있으면서 public이나 protected 생성자가 없는 클래스의 경우는 서브 클래스를 가질 수 없다는 것이다.
이런 단점으로 인해 상속 대신 컴포지션(composition)을 사용하게 끔 해주기 때문에 장점이 될 수도 있다. - 다른 static 메소드와 쉽게 구별할 수 없다는 것이다.
클래스나 인터페이스 주석으로 표시를 하거나, 공통적인 작명 규칙을 만들고 지킴으로써 이런 단점을 줄일 수 있다.
작명 규칙 예) valueOf, of, getInstance, newInstance, getType, newType
static 팩토리 메소드와 public 생성자는 모두 나름의 용도가 있으므로 상호간의 장점을 아는 것이 중요하다.
프로그래밍 기술의 습득 또한 규칙을 먼저 배운 다음 그 규칙을 언제 깰 것인지 아는 것이 중요하다.