자바(Java) 빌더 패턴, F-Bounded Polymorphism으로 타입 안전하게!

by DD
2개월 전
조회수 8

자바(Java)의 빌더 패턴(Builder Pattern)에서 상속 시 타입 정보가 유실되는 문제점을 지적함

F-Bounded Polymorphism을 활용하여 서브 클래스(Subclass)의 타입을 보존하는 해결책 제시

자바(Java)의 Enum에서 F-Bounded Polymorphism이 이미 사용되고 있음을 예시로 설명

C++의 Curiously Recurring Template Pattern과 유사성을 언급하며, 실용적인 측면 강조

빌더 패턴(Builder Pattern) 상속 시 타입 소실 문제

자바(Java)의 빌더 패턴(Builder Pattern)에서 상속(Inheritance)을 사용할 때, 서브 클래스(Subclass)의 타입 정보가 유실되는 문제점을 지적한다. VehicleBuilder를 상속받는 CarBuilder에서 make() 메서드를 호출하면 반환 타입이 VehicleBuilder로 고정되어, CarBuilder 고유의 메서드에 접근할 수 없게 된다. 이는 컴파일 타임(Compile Time)에 타입 안전성을 저해하는 주요 원인으로 작용한다.

F-Bounded Polymorphism을 활용한 해결책

F-Bounded Polymorphism을 통해 이러한 문제를 해결하는 방법을 제시한다. VehicleBuilder>와 같이 자기 자신을 타입 파라미터(Type Parameter)로 사용하는 기법을 통해, 서브 클래스(Subclass)가 자신의 타입을 반환하도록 구현한다. @SuppressWarnings("unchecked") 어노테이션을 사용하여 타입 캐스팅(Type Casting) 경고를 억제하면서, 컴파일 타임(Compile Time)에 타입 안전성을 확보한다.

자바(Java) Enum의 F-Bounded Polymorphism 활용

자바(Java)의 Enum에서 이미 F-Bounded Polymorphism이 활용되고 있음을 보여준다. Enum>과 같이 자기 자신을 바운드(Bound)로 사용하는 방식을 통해, Enum 간의 비교 연산(Comparison Operation)을 컴파일 타임(Compile Time)에 제한한다. 이는 런타임(Runtime) 오류를 컴파일 타임(Compile Time) 오류로 전환하여, 코드의 안정성을 높이는 효과를 가져온다.

C++의 Curiously Recurring Template Pattern과의 비교

댓글에서는 C++의 Curiously Recurring Template Pattern과 F-Bounded Polymorphism의 유사성을 언급한다. 두 기법 모두 서브 클래스(Subclass)의 타입을 슈퍼 클래스(Superclass)에서 참조하여, 타입 안전성을 확보하는 공통점을 가진다. Curiously Recurring Template Pattern은 템플릿(Template)을 사용하여 구현되며, F-Bounded Polymorphism과 유사한 방식으로 동작한다.

F-Bounded Polymorphism의 한계와 실용성

F-Bounded Polymorphism은 깊은 상속 구조(Deep Inheritance)에서는 복잡성이 증가하는 단점이 있다. ElectricCarBuilder가 CarBuilder를 상속받고, CarBuilder가 이미 F-Bound를 사용하고 있는 경우, ElectricCarBuilder는 자체적으로 F-Bound를 재정의할 수 없다. 하지만, 대부분의 실용적인 사용 사례에서는 단일 레벨의 상속 구조(Single Level Inheritance)를 가지므로, F-Bounded Polymorphism은 효과적인 해결책이 될 수 있다.

F-Bounded Polymorphism: Type-Safe Builders in Java