[Java] Builder pattern

programmeaow·2022년 6월 10일
0

Java

목록 보기
10/13

📚 빌더 패턴(Builder pattern)

- 빌더 패턴(Builder pattern) : 디자인 패턴 중 하나

복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여, 동일한 절차에서도 서로 다른 표현을 생성하는 방법

🍋 빌더 패턴의 장점

  1. 필요한 데이터만 활용 가능
  2. 코드 유연성 확보
  3. 메서드 변경 가능성 최소화
  4. 가독성을 높일 수 있음

@Builder 애노테이션을 사용하여 간편하게 빌더 패턴 코드를 작성할 수 있다.

함께 보면 좋은 빌더 작성 예제 / 설명 : (Github) java-design-patterns



@Builder 에 대해 알아보자.
먼저 데이터를 가지고 있는 Student 테이블을 생성하여 이름, 나이, 학년 객체를 생성해보았다.

public class Student {
	private String name;
	private int age;
	private String grade;
}

School 클래스를 새로 생성한 뒤 [ 이름 : James / 나이 : 15 / 학년 : 3 ] 의 데이터를 입력해보자.

빌더를 이용하지 않는다면 멤버 변수 초기화 메서드를 작성한 뒤, 메서드 호출로 데이터를 반환해줬을 것이다. 작성하면 이런 식의 코드가 된다.

//Student table의 멤버 변수 초기화 메서드
public Student(String name, int age, String grade) {
	super();
	this.name = name;
	this.age = age;
	this.grade = grade;
}
    
//School table에서 멤버 변수 초기화 시키기
public class School {
	public static void main(String[] args) {
    BuilderPattern1 b1 = new BuilderPattern1("James ", 15, "3학년");
    }
}

그런데 여기 Amy라는 14살의 학생이 있다. 이름과 나이만 알고 학년은 아직 알지 못한다.
Student 테이블에 학년을 제외한 이름과 나이 정보만 입력해보자.

이 경우, 두가지 방법으로 입력할 수 있다.

  1. 멤버 변수 초기화 메서드의 grade 입력 시, null 입력
  2. grade 없이 이름과 나이만 반환하는 멤버 변수 초기화 메서드를 새로 작성하기

이와 같이 멤버 변수들의 특정 값만 초기화 시키는 겨우, 메서드를 변경해야하는 번거로움을 줄이기 위해 @Builder 를 이용하는 것이다.



@Builder

이번에는 빌더를 이용해 정보를 입력해보자.

builder 는 parameter별로 생성자가 있는 것과 같은 효과를 낼 수 있지만, new 로 불러올 수 없기 때문에 Class명.builder 와 같이 호출한다.

- builder 작성 :

ClassName.builder( ).변수명1( data ).변수명2( data ) · · · .build( );

import lombok.Builder;

@Builder // 빌더 적용
@ToString
public class Student {
	private String name;
	private int age;
	private String grade;
}

코드를 작성한 뒤 위에 @Builder 를 적용하고 Import 해주었다!
이후 테스트에서 출력 값을 한번에 모두 확인하기 위해 @ToString 도 함께 작성했다.

먼저, builder 만 출력하면 어떤 값이 나오는지 확인해보자.

public class School {
	public static void main(String[] args) {
    
    System.out.println(Student.builder());
    }
}

//출력 : Student.StudentBuilder(name=null, age=0, grade=null)

Student 테이블에 있는 멤버 변수들의 기본 값이 출력되는 것을 확인할 수 있다.


빌더를 사용하여 [ 이름 : James / 나이 : 15 / 학년 : 3 ] 데이터를 새로 입력해보자.
public class School {
	public static void main(String[] args) {
    
    Student s = Student.builder().name("James").age(15).grade("3학년").build();
    System.out.println(s);
    }
}

//출력 : Student(name=James, age=15, grade=3학년)

[ 이름 : Amy / 나이 : 14 ] 의 데이터를 입력해보자.

public class School {
	public static void main(String[] args) {
    
    Student a = Student.builder().name("Amy").age(14).build();
    System.out.println(a);
    }
}

//출력 : Student(name=James, age=15, grade=null)

Tim 이라는 이름 값만 입력해보자.

public class School {
	public static void main(String[] args) {
    
    Student t = Student.builder().name("Tim").build();
    System.out.println(t);
    }
}

//출력 : Student(name=Tim, age=0, grade=null)

이와 같이 빌더를 사용하면 메서드의 변경이나 추가 없이 코드를 유연성 있게 만드는 것이 가능하다.


참고 : [생성 패턴] 빌더 패턴(Builder pattern) 이해 및 예제
참고 : [Design Pattern] GoF 생성 패턴 - 빌더 패턴(Builder Pattern)

profile
개발이란 뭘까

0개의 댓글