[Java] 생성자와 정적 팩토리 메서드 비교

2022. 5. 11. 23:29JAVA/Overview

인스턴스의 생성과 생성자의 관계

일반적으로 new 키워드를 사용하여 인스턴스를 생성하면 생성자가 수행됩니다. 주목할점은 생성자는 인스턴스를 생성하는 것이 아니라 인스턴스의 필드 멤버를 초기화하는 목적으로 수행된다는 점입니다. 정리하면 생성자는 인스턴스를 생성하는 함수가 아니라 필드 멤버를 초기화해주는 것입니다.

 

생성자 기본 규칙

1. 생성자의 이름은 클래스의 이름과 동일해야 합니다.

2. 생성자는 리턴 타입이 없습니다. 만약 생성자에 리턴 타입을 정의한다면 컴파일러는 생성자가 아닌 일반적인 메서드로 간주할 것입니다.

3. 생성자에 적용할 수 있는 제어자는 접근제어자로써 public, protected, default, private가 존재합니다.

 

기본 생성자(Default Constructor)

1. 컴파일러는 기본 생성자를 생성하지만 JVM(Java Virtual Machine)은 생성하지 않습니다.

2. 만약 생성자를 정의하지 않으면 컴파일러는 컴파일 타임에 자동으로 기본 생성자를 생성합니다.

3. 모든 클래스는 기본 생성자 또는 개발자에 의해 명시적으로 정의한 생성자가 포함될 수 있습니다.

 

기본 생성자의 특징

1. 매개변수가 없음

2. 기본 생성자의 접근 제어자는 클래스의 접근 제어자와 동일함

3. 부모 클래스의 생성자를 호출하기 위해서 "super()" 명령어를 첫번째 라인에 정의합니다. 개발자에 의해서 명시적으로 super()를 제거해도 컴파일 타임에 자동으로 생성되어 삽입됩니다.

 

정적 팩토리 메서드(static factory method)

1. 어떤 한 메서드가 동일한 클래스 타입의 인스턴스를 반환하는 경우 이러한 유형의 메서드를 정적 팩토리 메서드라고 함

2. 정적 팩토리 메서드는 네이티브 클래스(정적 팩토리 메서드를 멤버로 소유한 클래스)의 인스턴스를 반환하는 메서드입니다.

3. 정적 팩토리 메서드는 생성자와는 달리 클래스의 이름과 동일하지 않습니다.

4. 정적 팩토리 메서드에서는 각각의 호출시마다 새로운 객체를 생성할 필요는 없습니다. 즉, 필요한 경우에는 미리 생성해 놓은 객체를 반환할 수 있습니다.

 

정적 팩토리 메서드와 생성자의 예제

public class Car{
    private String name;
    private int price;
    
    // 기본 생성자
    public Car(){
    
    }
    
    // 생성자
    public Car(String name, int price){
    	this.name = name;
        this.price = price;
    }
    
    // 정적 팩토리 메서드
    public static Car SM3(){
    	return new Car("SM3", 2500);
    }
    
    // 정적 팩토리 메서드
    public static Car K5(){
    	return new Car("K5", 3000);
    }
    
    public static void main(String[] args){
    	Car car = new Car("K2", 1800); // 생성자를 이용한 객체 생성
        Car sm3 = Car.SM3();    // 정적 팩토리 메서드를 이용한 객체 생성
        Car k5 = Car.K5();      // 정적 팩토리 메서드를 이용한 객체 생성
    }
}

 

생성자와 정적 팩토리 메서드의 비교

생성자 정적 팩토리 메서드
생성자는 의미있는 이름을 가지지 않습니다. 그래서 생성자는 언제나 표준 네이밍 규칙에 따라 제한됩니다. (생성자의 이름은 클래스 이름과 동일해야함) 정적 팩토리 메서드는 의미 있는 이름을 가질 수 있으므로 이 메서드가 하는 것을 명시적으로 클라이언트에게 전달할 수 있습니다.
생성자는 리턴 타입이 존재하지 않습니다. 정적 팩토리 메서드는 리턴 타입이 존재합니다.
생성자의 정의에는 필드멤버의 초기화가 수행됩니다. 정적 팩토리 메서드 정의에는 인스턴스를 생성합니다.
생성자는 언제나 새로운 인스턴스를 힙 안에서 동적으로 생성합니다. 그래서 생성자로부터 클래스의 캐싱된 인스턴스를 리턴할 수 없습니다. 정적 팩토리 메서드는 캐싱 할 수 있기 때문에 새로운 인스턴스를 언제나 생성하는것 대신에 팩토리 메서드로부터 같은 불변 클래스의 인스턴스를 참조하여 반환할 수 있습니다. 
생성자의 첫번째 라인에는 super() 또는 this()가 호출됩니다. 정적 팩토리 메서드는 super()와 this()가 첫번째 라인에 있는 것이 필수적이지는 않습니다.

 

References

[GeeksForGeeks] Difference Between Constructor and Static Factory Method in Java