아이템 1 - 생성자 대신 정적 팩터리 메서드를 고려하라
일반적인 방법
클래스를 사용하려면 "public 생성자"라는 도구를 써서 그 클래스의 실제 물건(인스턴스)을 만든다
생성자 : 클래스에서 인스턴스를 만드는 특별한 방법 클래스 : 설계도 인스턴스 : 설계도를 통해 실제로 만든 것
정적 메소드
public 생성자를 사용하는 방법 외 인스턴스를 만드는 방법
→ 클래스가 인스턴스를 만드는 방법으로 꼭 생성자를 사용할 필요는 없다. 정적 팩토리 메소드라는 특별한 방법을 사용할 수 있다.
정적 : 고정되어 있다는 뜻. 클래스를 따로 만들지 않아도 바로 사용 가능하다. 팩토리 : 새로운 인스턴스를 만드는 방법
흔히 사용하는 public static 이 바로 정적 팩토리 메소드이다!!
public class Car {
private Car() {
// 생성자
}
public static Car createNewCar() {
return new Car(); // 정적 팩토리 메서드
}
}
정적 메소드의 장점 5가지
1. 이름을 가질 수 있다. 생성자는 클래스명과 동일한 이름을 가지기 때문에, 그 의도를 명확히 전달하기 어렵다. 반면, 정적 팩토리 메서드는 이름을 통해 메서드의 목적을 보다 분명하게 전달할 수 있다.
예시: BigInteger(int, int)와 같은 생성자는 어떤 역할을 하는지 알기 어렵지만, BigInteger.probablePrime(int, Random)과 같은 정적 팩토리 메서드는 "이 메서드가 특정 크기의 소수를 반환하는구나"라고 바로 알 수 있다.
2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
정적 팩토리 메서드는 싱글턴 패턴이나 캐싱 기법을 적용해, 같은 객체를 여러 번 생성하지 않고 재사용할 수 있다. 이는 메모리 사용을 절약하고, 성능 최적화에 도움이 된다.
예시: Boolean.valueOf(true)는 Boolean.TRUE를 반환하는데, 이처럼 자주 사용하는 불변 객체는 매번 생성하는 대신 미리 만들어둔 객체를 반환한다. 이로 인해 불필요한 객체 생성이 줄어들고, 성능이 향상!!
3. 리턴 타입의 하위 타입 객체를 반환할 수 있다.
정적 팩토리 메서드는 반환 타입을 유연하게 설정할 수 있다. 생성자는 항상 특정 클래스의 객체를 반환하지만, 정적 팩토리 메서드는 상위 클래스나 인터페이스를 반환하면서 내부적으로 다양한 하위 클래스의 인스턴스를 반환할 수 있다.
예시: Collections.synchronizedList(new ArrayList<>())는 동기화된 리스트를 반환하지만, 실제 반환 타입은 List 인터페이스이다. 내부적으로는 동기화된 리스트 구현체가 반환되지만, 클라이언트는 그 구체적인 타입을 몰라도 괜찮다~
4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
정적 팩토리 메서드는 매개변수 값에 따라 적절한 객체를 선택적으로 반환할 수 있습니다. 이는 매개변수 기반 객체 선택을 유연하게 처리할 수 있다는 의미입니다.
예시: EnumSet.of는 매개변수의 개수에 따라 RegularEnumSet이나 JumboEnumSet을 반환한다. 작은 데이터셋에는 RegularEnumSet, 큰 데이터셋에는 JumboEnumSet을 사용해 메모리 사용 효율성을 높인다.
5. 정적 팩토리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
객체 생성은 비용이 큰 연산일 수 있기 때문에, Lazy Initialization(지연 초기화) 기법을 통해 실제로 객체가 필요할 때 생성하는 것이 좋다. 정적 팩토리 메서드를 사용하면 이 패턴을 쉽게 구현할 수 있다.
예시: Optional.empty()는 실제로 Optional 객체가 필요할 때 그 객체를 생성해 반환합니다. 그 전에는 불필요한 객체 생성이 일어나지 않으므로 성능이 개선됩니다.
정적 메소드의 단점 2가지
1. 정적 팩토리 메서드만 제공하면 하위 클래스를 만들 수 없다. 정적 팩토리 메서드를 사용하면 일반적으로 생성자를 private으로 선언하여 외부에서 인스턴스를 생성하지 못하게 합니다. 이로 인해 해당 클래스를 상속받아 확장하는 것이 불가능해질 수 있습니다.
2. 정적 팩토리 메서드는 프로그래머가 찾기 어렵다 정적 팩토리 메서드는 생성자와 달리 일반적인 관례가 아니기 때문에, 해당 메서드를 사용할 수 있다는 사실을 모르면 놓치기 쉽다. 정적 팩토리 메서드의 이름을 명확히 지어야 하며, API 문서를 통해 충분히 설명해야 한다.
'Backend 🖥️' 카테고리의 다른 글
[Effective Java] 2장 객체 생성과 파괴 : item 4, 5 (0) | 2024.10.22 |
---|---|
[Effective Java] 2장 객체 생성과 파괴 : item 2, 3 (0) | 2024.09.28 |
HTTP 와 HTTPS의 개념과 차이점 (0) | 2024.09.12 |
CI/CD 란? (1) | 2024.08.19 |
Gunicorn 이란? 쓰는 이유는? (0) | 2024.08.14 |