목차
2주차 미션을 진행하며 코드 리뷰의 피드백으로 정적팩토리메서드 도입에 대한 피드백을 받아 정리해보고자한다.
정적팩토리 메서드
정적 팩토리 메서드는 클래스의 인스턴스를 생성하기 위해 사용하는 정적 메서드(static method)이다.
보통 생성자를 대체하거나 보완하는 방식으로 사용되며, 객체 생성과 관련된 다양한 기능을 제공한다.
정적 팩토리 메서드의 개념
- 정적(static) 메서드로 정의되어, 인스턴스를 반환하는 역할을 수행.
- 생성자와 달리 메서드 이름을 자유롭게 정의할 수 있어, 가독성과 유연성이 증가.
- 객체 생성 로직을 캡슐화하여, 재사용성과 유지보수성을 높임.
정적 팩토리 메서드의 장점
의미 있는 이름
- 생성자보다 메서드 이름을 명시적으로 지정할 수 있어, 의도를 명확히 표현 가능.
// 생성자 방식
BigInteger bigInt = new BigInteger("12345");
// 정적 팩토리 메서드 방식
BigInteger bigInt = BigInteger.valueOf(12345); // 더 직관적
객체 생성 로직의 캡슐화
- 복잡한 객체 생성 로직을 정적 팩토리 메서드 내부에 숨길 수 있음.
public static LocalDate fromEpochMilli(long epochMilli) {
return Instant.ofEpochMilli(epochMilli).atZone(ZoneId.systemDefault()).toLocalDate();
}
객체 캐싱 및 재사용 가능
- 이미 생성된 객체를 반환하거나, 동일한 값의 객체를 재사용할 수 있음 (싱글턴 패턴 등).
public class BooleanWrapper {
private static final BooleanWrapper TRUE_INSTANCE = new BooleanWrapper(true);
private static final BooleanWrapper FALSE_INSTANCE = new BooleanWrapper(false);
private boolean value;
private BooleanWrapper(boolean value) {
this.value = value;
}
public static BooleanWrapper of(boolean value) {
return value ? TRUE_INSTANCE : FALSE_INSTANCE;
}
}
하위 클래스 반환 가능
- 팩토리 메서드는 반환 타입을 제한하지 않으므로, 다른 하위 클래스 객체를 반환 가능.
public interface Animal {
void sound();
}
public class Dog implements Animal {
public void sound() {
System.out.println("Woof!");
}
}
public class Cat implements Animal {
public void sound() {
System.out.println("Meow!");
}
}
public class AnimalFactory {
public static Animal createAnimal(String type) {
return "dog".equalsIgnoreCase(type) ? new Dog() : new Cat();
}
}
불변 객체 생성 용이
- 객체를 변경할 수 없도록 보장하면서 다양한 형태의 객체를 생성 가능.
public static List<String> immutableList(String... elements) {
return Collections.unmodifiableList(Arrays.asList(elements));
}
다중 반환 타입 지원
- 동일한 메서드 이름으로 입력에 따라 다른 객체를 반환 가능.
public static Number getNumber(boolean isInteger) {
return isInteger ? Integer.valueOf(42) : Double.valueOf(42.0);
}
생성자 중복 방지
- 생성자 오버로딩 대신 명시적 메서드 이름으로 대체 가능.
public static User withName(String name) {
return new User(name, "defaultEmail@example.com");
}
public static User withNameAndEmail(String name, String email) {
return new User(name, email);
}
정적 팩토리 메서드의 단점
상속 불가능
- 정적 메서드는 클래스 수준에서 동작하므로, 하위 클래스에서 재정의가 불가능.
- 다형성 지원이 어렵다.
디버깅 복잡성
- 메서드 내부 로직이 복잡하거나 객체를 캐싱할 경우, 생성 과정이 명확하지 않아 디버깅이 어려울 수 있다.
직관성 부족
- 정적 팩토리 메서드는 생성자처럼 new 키워드를 사용하지 않기 때문에, 초심자가 객체 생성 방식을 이해하기 어려울 수 있다.
정적 팩토리 메서드와 생성자 비교
이름 지정 가능 | 가능 | 불가능 (클래스명과 동일) |
객체 재사용 | 가능 (캐싱 가능) | 불가능 |
하위 클래스 반환 | 가능 | 불가능 |
타입 안전성 | 보장 | 보장 |
상속성 | 메서드 재정의 불가능 | 생성자는 상속된 클래스에서 호출 가능 |
복잡한 로직 처리 | 가능 | 불가능 |
정적 팩토리 메서드 꼭 사용해야할까 ? 어떻게 사용해야할까 ?
정적 팩토리 메서드 패턴에 대해 공부를 하며 다양한 디자인 패턴이 있다는 것을 알게 되었으며 객체지향의 위력을 다시 한번 느끼게되었다.
위와같은 많은 장점이 있지만 지금 현재로서는 '가독성'을 높이는 네이밍이 가장 와닿는것 같다.
이후 더욱 객체지향에 대해 공부하며 디자인 패턴을 익히며 이외의 다양한 장점 또한 흡수 할수 있을 것으로 기대된다 !!
이제 실제 3주차 미션에 적용을 하러 가보자 !
'외부활동 > 우아한테크코스 [프리코스]' 카테고리의 다른 글
[우아한테크코스 7기] 프리코스 3주차 회고 (0) | 2024.11.05 |
---|---|
원시값 포장, VO, 일급 객체, 일급 컬렉션 톺아보기 (0) | 2024.11.02 |
상수관리에 Enum은 필수적인가 ? (0) | 2024.11.01 |
[우아한테크코스 7기] 프리코스 2주차 회고 (0) | 2024.10.29 |
우아한테크코스 NsTest,Assertions 톺아보기 (0) | 2024.10.27 |