[이펙티브 자바] 정적팩토리 메소드 와 생성자

KangWook·2024년 8월 28일
0

Java에서 객체를 생성하는 방법에는 여러 가지가 있습니다. 그 중 대표적인 방법은 생성자를 사용하는 것이며, 정적 팩토리 메소드를 활용하는 것도 널리 사용됩니다. 정적 팩토리 메소드 중에서 from, of, to 메소드가 자주 사용됩니다. 정적 팩토리 메소드와 생성자의 차이점을 비교하여 설명하겠습니다.

생성자(Constructor)

생성자는 클래스의 인스턴스를 생성하는 데 사용되는 특별한 메소드입니다. 주로 다음과 같은 특징이 있습니다.

  • 클래스명과 동일한 이름: 생성자는 클래스의 이름과 같으며 반환 타입이 없습니다.

  • 단순한 객체 생성: 생성자는 객체를 초기화하는 기본적인 방법으로 널리 사용됩니다.

  • 상속 및 오버로딩 지원: 생성자는 오버로딩(같은 이름의 생성자를 여러 개 정의할 수 있음)을 지원합니다.

  • 명확한 초기화: 생성자는 객체를 생성하는 즉시 초기화 코드를 실행할 수 있습니다.

예제:

public class Person {
    private String name;
    private int age;

    // 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

정적 팩토리 메소드 (Static Factory Methods)

정적 팩토리 메소드는 클래스의 인스턴스를 생성하는 방법 중 하나로, 객체를 반환하는 정적 메소드입니다. from, of, to와 같은 메소드는 다양한 방식으로 객체를 생성하는 데 사용됩니다.

from 메소드

• 용도: 주로 다른 타입의 객체나 데이터를 기반으로 새로운 객체를 생성할 때 사용됩니다.

• 장점: 가독성을 높이고, 다양한 타입의 인스턴스를 쉽게 생성할 수 있습니다.

예제:

public class Date {
    private int day;
    private int month;
    private int year;

    // 생성자가 아닌 정적 팩토리 메소드
    public static Date from(String dateString) {
        // 문자열을 파싱하여 Date 객체 생성
        String[] parts = dateString.split("-");
        return new Date(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), Integer.parseInt(parts[2]));
    }
}

of 메소드

•용도: 값을 받아 객체를 생성할 때 사용됩니다. 간결하고 명확한 방법으로 객체를 생성할 수 있습니다.

•유연성: 다양한 파라미터 조합을 지원하거나, 다른 방법으로 객체를 생성할 수 있습니다. 예를 들어, Color.of(int red, int green, int blue)는 다양한 색상 객체를 생성할 수 있습니다.

•장점: 코드의 의도를 명확히 하고, 객체 생성 시 명확한 입력 값을 받을 수 있습니다.

public class Color {
    private int red;
    private int green;
    private int blue;

    // 정적 팩토리 메소드
    public static Color of(int red, int green, int blue) {
        return new Color(red, green, blue);
    }
}

to 메소드

• 용도: 특정 형식의 데이터를 변환하거나 다른 타입으로 변환할 때 사용됩니다. 보통 기존 객체를 다른 형식으로 변환할 때 사용됩니다.

• 장점: 변환 로직을 캡슐화하여 코드의 유지보수를 용이하게 합니다.

예제:

public class Person {
    private String name;
    private int age;

    // 정적 팩토리 메소드
    public static Person fromUser(User user) {
        return new Person(user.getName(), user.getAge());
    }
}

정적 팩토리 메소드 비교

장점

생성자
• 직관성: 객체 생성의 기본적인 방법으로 직관적입니다.

• 명확성: 생성자의 파라미터를 통해 객체의 상태를 초기화합니다.


정적 팩토리 메소드
• 이름 지정 가능: 메소드 이름을 통해 객체 생성의 의도를 명확히 할 수 있습니다 (from, of, to 등).
• 유연성: 다양한 파라미터 조합을 지원하거나 다른 방식으로 객체를 생성할 수 있습니다.

• 캡슐화: 객체 생성 로직을 메소드 내부에 캡슐화하여 코드의 유지보수를 용이하게 합니다.

• 싱글턴 패턴 적용 가능: 정적 팩토리 메소드를 활용하여 싱글턴 패턴과 같은 패턴을 쉽게 구현할 수 있습니다.


단점

생성자
• 제한된 이름: 생성자는 클래스명과 동일하기 때문에 생성자 이름을 다양하게 설정할 수 없습니다.

• 코드 중복: 동일한 파라미터를 가진 여러 생성자가 있을 경우, 코드 중복이 발생할 수 있습니다.


정적 팩토리 메소드
• 추적 어려움: 메소드 이름에 따라 객체 생성의 로직이 다를 수 있어, 코드의 추적이 어려울 수 있습니다.

• 상속 제한: 정적 팩토리 메소드는 상속할 수 없습니다.


성능 비교

case 1: 객체의 생성자를 사용하여 반환 하는 경우

case 2: 정적 팩토리 메소드를 사용하여 반환 하는경우

결론

성능 측면에서는 일반적인 객체 생성에서는 생성자와 정적 팩토리 메소드의 성능 차이는 미미할 수 있습니다. 그러나 복잡한 생성 로직이 필요하거나 객체 생성을 최적화해야 하는 경우, 정적 팩토리 메소드가 더 유리할 수 있습니다.

명확성 및 유지보수 측면에서는 정적 팩토리 메소드는 객체 생성의 의도를 명확히 하고, 복잡한 생성 로직을 캡슐화할 수 있어 유지보수 측면에서 장점을 제공합니다.

생성자는 직관적이며 기본적인 객체 생성에 적합하기 때문에 개발 할때 상황에 맞게 생성자와 정적 팩토리 메소드를 선택하여 사용하면 될것 같습니다.

profile
꾸준히 성장하는 개발자

0개의 댓글