상속 구조에서 @Builder를 어떻게 사용할 수 있을지 고민하던 중, 더 유연한 방식으로 객체 생성 패턴을 지원하는 @SuperBuilder 어노테이션을 알게 되었습니다.
이 글에서는 @SuperBuilder의 개념, 사용 예시, 그리고 이를 사용함으로써 얻을 수 있는 장점에 대해 알아보도록 하겠습니다.🧐
@SuperBuilder란?
@SuperBuilder는 Lombok 라이브러리에서 제공하는 어노테이션으로 상속 구조에서 빌더 패턴을 간편하게 사용할 수 있도록 도와줍니다. 기본적으로 Lombok의 @Builder는 상속 구조를 지원하지 않기 때문에 상속된 클래스들에서 객체를 생성할 때는 여러 문제점이 발생할 수 있습니다. 이 문제를 해결하기 위해 등장한 것이 @SuperBuilder입니다.
@SuperBuilder는 부모 클래스와 자식 클래스 모두에서 빌더 패턴을 사용할 수 있게 해 줍니다. 이로 인해 상속 관계에 있는 클래스들 간의 빌더 체인도 쉽게 관리할 수 있으며, 코드의 가독성과 유지보수성을 높여줍니다.
@SuperBuilder 사용 예시
부모 클래스: Animal
import lombok.experimental.SuperBuilder;
@SuperBuilder
public class Animal {
private String name;
private int age;
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
자식 클래스: Dog
import lombok.experimental.SuperBuilder;
@SuperBuilder
public class Dog extends Animal {
private String breed; // Dog만의 고유 속성 (견종)
@Override
public String toString() {
return "Dog{" +
"breed='" + breed + '\'' +
", " + super.toString() +
'}';
}
}
사용 예시
public class Main {
public static void main(String[] args) {
// Dog 객체 생성
Dog dog = Dog.builder()
.name("Buddy")
.age(3)
.breed("Golden Retriever")
.build();
System.out.println(dog);
}
}
Animal 클래스는 공통 속성인 name과 age를 가지고 있습니다.
그리고 Dog 클래스는 Animal을 상속받아 breed(견종)를 추가로 가지고 있습니다.
이처럼 @SuperBuilder를 사용하면 상위 클래스와 하위 클래스의 필드를 함께 설정하고 객체를 생성할 수 있습니다.
@SuperBuilder의 장점
- 상속 관계에서 빌더 패턴의 사용
@SuperBuilder는 상속된 클래스에서 빌더 패턴을 안전하게 사용할 수 있게 해 줍니다.
부모 클래스의 필드도 빌더에서 쉽게 설정할 수 있으며, 자식 클래스의 필드 역시 문제없이 처리됩니다. - 코드 중복 감소
@SuperBuilder를 사용하면 부모 클래스와 자식 클래스 모두에서 빌더 메서드를 재정의하지 않고 사용할 수 있어 코드 중복을 줄이고 관리하기 쉬워집니다. - 명확한 계층 구조 유지
상속 구조에서 객체를 생성할 때 계층 구조가 명확히 유지되며 부모 클래스의 필드도 손쉽게 초기화할 수 있습니다.
사용 시 주의사항
- @SuperBuilder는 상속 구조에서만 유용하며 단일 클래스에서는 기존의 @Builder를 사용하는 것이 적합합니다.
- @SuperBuilder를 사용하는 클래스는 반드시 public 생성자 또는 protected 생성자를 가져야 합니다.
💡 @SuperBuilder는 상속 관계에서 객체 생성과 초기화를 효율적으로 처리하는데 매우 유용합니다.
이를 통해 코드의 구조를 더 깔끔하게 만들 수 있습니다.
'Backend > Java' 카테고리의 다른 글
| [Java]자바 메모리 관리: 스택(Stack)& 힙(Heap) (1) | 2024.11.20 |
|---|---|
| [Java] Optional 한눈에 정리하기 (0) | 2024.11.19 |
| [Java] String.valueOf()와 toString() 차이점 (0) | 2024.10.14 |
| [Java] 직렬화(Serialization) (1) | 2024.09.17 |
| [Java] 람다 표현식(Lambda Expressions) (0) | 2024.09.16 |