[Java] 빌더 패턴 (+ @Builder)

2024. 9. 15. 17:21· Java
목차
  1. 1. 빌더 패턴 (Builder Pattern)
  2. 1-1. 빌더 패턴 예제
  3. 1-2. 빌더 패턴 장점
  4. 1-3. 빌더 패턴 단점
  5. 2. @Builder로 빌더 패턴 구현하기
  6. 2-1. Lombok 의존성 추가
  7. 2-2. 클래스에 @Builder 어노테이션 추가

1. 빌더 패턴 (Builder Pattern)

  • 객체 생성 시 단계별로 생성 가능하게 도와주는 디자인 패턴
  • 객체의 생성 과정을 분리함 ⇒ 다양한 구성요소를 조합하여 객체 생성
    • ex) 이름, 나이, 학년, 과목, 학점 등을 가지는 Person 클래스 ⇒ 이름, 나이만 갖는 객체 / 이름, 나이, 학년만 갖는 객체 등
  • 주로 매개변수가 많은 생성자, 불변객체 등을 만들때 유용함

 

1-1. 빌더 패턴 예제

  • Person.java
@ToString
public class Person {

    private String name;
    private int age;
    private double grade;

    // 빌더 사용 생성자
    public Person(PersonBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.grade = builder.grade;
    }

    // 빌더 클래스
    public static class PersonBuilder {
        private String name;
        private int age;
        private double grade;

        public PersonBuilder setName(String name) {
            this.name = name;
            return this;
        }

        public PersonBuilder setAge(int age) {
            this.age = age;
            return this;
        }

        public PersonBuilder setGrade(double grade) {
            this.grade = grade;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}

 

  • Main.java
public class Main {
    public static void main(String[] args) {
        Person person1 = new Person.PersonBuilder()
                .setName("이름1")
                .setAge(20)
                .setGrade(4.3)
                .build();

        Person person2 = new Person.PersonBuilder()
                .setName("이름2")
                .setAge(20)
                .build();

        Person person3 = new Person.PersonBuilder()
                .setGrade(4.5)
                .build();

        System.out.println("person1 = " + person1.toString());
        System.out.println("person2 = " + person2.toString());
        System.out.println("person3 = " + person3.toString());
    }
}

/* 실행 결과
person1 = Person(name=이름1, age=20, grade=4.3)
person2 = Person(name=이름2, age=20, grade=0.0)
person3 = Person(name=null, age=0, grade=4.5)*/

 

1-2. 빌더 패턴 장점

1. 가독성 향상

// 필드를 많이 갖는 클래스라면 생성자로 객체 생성 시 각각의 파라미터가 무엇을 의미하는지 헷갈림
Person person = new Person("이름1", 20, 4.3, 180, ... , "email@gmail.com");

// 빌더 패턴 사용하면 어떤 파라미터인지 명확함!
Person person = Person.builder()
				.name("이름1")
				.age(20)
				.grade(4.3)
				.height(180) ... .build();

 

2. 필요한 필드만 사용 가능

  • 생성자로만 객체 생성한다면 필요한 필드 조합에 해당하는 생성자를 모두 만들어야 함 (혹은 더미값을 넘김)
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    // 이름만 갖는 생성자
		
    // 이름, 나이만 갖는 생성자
		
    // 이름, 학점만 갖는 생성자
		
    ...
}
  • 빌더 패턴 사용한다면 빌더에 해당하는 코드만 생성하면 다양한 필드 조합으로 객체 생성 가능함!

 

1-3. 빌더 패턴 단점

  1. 빌더에 해당하는 추가적인 클래스를 생성해야 함
    ⇒ @Builder로 해결 가능!
  2. 추가적인 메모리 사용
    • 빌더 객체를 별도로 생성함 ⇒ 메모리 사용량 증가

 

2. @Builder로 빌더 패턴 구현하기

  • 위의 예제에 해당하는 Person.java를 @Builder 사용 방식으로 변경

 

2-1. Lombok 의존성 추가

  • build.gradle
dependencies {
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

 

2-2. 클래스에 @Builder 어노테이션 추가

  • Person.java 수정
@ToString
@Builder
public class Person {

    private String name;
    private int age;
    private double grade;
}

⇒ @Builder 어노테이션이 빌더 사용 생성자, 빌더 클래스 등의 코드를 자동으로 생성함!!

 

  • Main.java
public class Main {
    public static void main(String[] args) {

        Person person1 = Person.builder()
                .name("이름1")
                .age(20)
                .grade(4.3).build();

        Person person2 = Person.builder()
                .name("이름2")
                .age(20).build();

        Person person3 = Person.builder()
                .grade(4.5).build();

        System.out.println("person1 = " + person1.toString());
        System.out.println("person2 = " + person2.toString());
        System.out.println("person3 = " + person3.toString());
    }
}

/* 실행 결과 (위의 예제와 동일)
person1 = Person(name=이름1, age=20, grade=4.3)
person2 = Person(name=이름2, age=20, grade=0.0)
person3 = Person(name=null, age=0, grade=4.5)*/
저작자표시 변경금지 (새창열림)

'Java' 카테고리의 다른 글

[Java] 예외 처리 (Exception Handling)  (0) 2024.07.28
[Java] 자바 제네릭스 (Generics)  (0) 2024.07.28
[Java] 입출력(I/O), 스트림, 버퍼  (5) 2024.07.28
[Java] 자바 메모리 구조  (0) 2024.07.09
[Java] final  (0) 2024.07.09
  1. 1. 빌더 패턴 (Builder Pattern)
  2. 1-1. 빌더 패턴 예제
  3. 1-2. 빌더 패턴 장점
  4. 1-3. 빌더 패턴 단점
  5. 2. @Builder로 빌더 패턴 구현하기
  6. 2-1. Lombok 의존성 추가
  7. 2-2. 클래스에 @Builder 어노테이션 추가
'Java' 카테고리의 다른 글
  • [Java] 예외 처리 (Exception Handling)
  • [Java] 자바 제네릭스 (Generics)
  • [Java] 입출력(I/O), 스트림, 버퍼
  • [Java] 자바 메모리 구조
공대생안씨
공대생안씨
전자공학과 학부생의 코딩 일기
티스토리
|
로그인
공대생안씨
공대생의 코딩 일기
공대생안씨
글쓰기
|
관리
전체
오늘
어제
  • All Categories (153)
    • Spring Boot (46)
      • JPA (7)
      • Lombok (2)
    • Java (21)
    • DevOps (3)
      • CI,CD (8)
      • Monitoring (2)
    • Database (7)
      • MySQL (5)
      • MongoDB (1)
      • H2 (1)
    • Trouble Shooting (5)
    • FE (4)
    • IntelliJ (3)
    • Git (3)
    • Algorithm (41)

블로그 메뉴

  • 홈
  • 태그
  • Github

공지사항

인기 글

hELLO · Designed By 정상우.v4.2.2
공대생안씨
[Java] 빌더 패턴 (+ @Builder)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.