Intro::
객체를 생성하는 두 가지 주요 방법인 생성자와 정적 팩토리 메서드 방식의 차이와 장단점에 대해 알아봅시다.
생성자
생성자는 클래스의 인스턴스를 초기화하는 특별한 메서드입니다. 모든 클래스에는 하나 이상의 생성자가 있으며, 명시적으로 정의하지 않으면 컴파일러가 기본 생성자를 제공합니다.
장점
- 단순하고 직관적: 새 객체를 생성하는 가장 기본적인 방법입니다.
- 상속이 용이: 생성자를 가진 클래스는 다른 클래스에서 확장하기 쉽습니다.
- 객체 생성 과정이 명확함: 생성자는 객체 생성을 위해 항상
new
키워드와 함께 사용됩니다.
단점
- 동일한 시그니처의 생성자 오버로딩 제한: 생성자는 매개변수의 타입과 숫자에 의해서만 구별될 수 있습니다. 같은 타입의 매개변수를 여러 개 받는 생성자를 여러 개 만들 수 없습니다.
- 객체 생성 시 매번 새 객체 생성: 생성자는 호출될 때마다 새로운 인스턴스를 만들기 때문에, 불필요하게 자원을 소모할 수 있습니다.
정적 팩토리 메서드란?
정적 팩토리 메서드는 클래스 내에 정의된
static
메서드를 통해 객체 인스턴스를 반환합니다. 이 메서드는 생성자와 다르게 이름을 가질 수 있어 사용자에게 반환되는 객체의 특성을 더 명확하게 전달할 수 있습니다.장점
- 이름을 가짐: 정적 팩토리 메서드는 메서드 이름을 통해 반환되는 객체의 특성을 설명할 수 있어, 코드의 가독성과 명확성이 향상됩니다.
- 호출될 때마다 객체를 생성하지 않아도 됨: 필요에 따라 불변 객체(immutable objects)를 캐싱하고 재사용할 수 있어 메모리 사용과 생성 비용을 절약할 수 있습니다.
- 하위 타입 객체 반환 가능: 반환되는 객체의 클래스를 자유롭게 선택할 수 있어, 유연성이 증가합니다. 인터페이스 기반의 메서드를 제공할 수 있어 API를 더 유연하게 만들 수 있습니다.
- 파라미터에 따라 다른 클래스의 객체를 반환할 수 있음: 입력 파라미터에 따라 다양한 클래스의 인스턴스를 반환할 수 있어, 사용자는 구현 클래스를 몰라도 됩니다.
단점
- 상속을 할 때 제한: 클래스가 자신의 인스턴스를 생성하는 정적 메서드를 포함하고 있으면, 하위 클래스에서 이 메서드를 오버라이드할 수 없습니다.
- 다른 정적 메서드와 구분이 어려움: API 문서만 보고는 생성자와 정적 팩토리 메서드를 쉽게 구분할 수 없을 때가 있습니다.
- 정적 팩토리 메서드만 제공하는 클래스는 상속을 받을 수 없음: 이런 클래스를 확장하는 것이 불가능합니다.
코드 예시
public class Boolean { private final boolean value; private static final Boolean TRUE = new Boolean(true); private static final Boolean FALSE = new Boolean(false); private Boolean(boolean value) { this.value = value; } public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } }
위 예제에서
Boolean
클래스는 TRUE
와 FALSE
라는 두 개의 정적 상수를 가지고, valueOf
라는 정적 팩토리 메서드를 통해 필요한 인스턴스를 반환합니다. 이 방법으로 new
를 사용하지 않고도 필요한 Boolean
객체를 얻을 수 있으며, 메모리 사용을 최적화할 수 있습니다.
Loading Comments...