빌더 패턴
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 67번째.
Builder Pattern은 많은 optional 매개변수가 있는 복잡한 객체를 생성하는 일반적인 문제를 해결하는 생성 디자인 패턴입니다. 여러 constructor를 만들거나 사용하지 않는 매개변수에 null을 전달하는 대신, Builder를 사용하면 객체를 단계별로 구성할 수 있습니다.
필수 필드(name, email)와 선택적 필드(age, phone, address)를 사용하는 User 객체를 생성한다고 생각해 보세요. Builder가 없다면 텔레스코핑 생성자를 사용하거나 여러 매개변수를 받는 복잡한 생성자를 만들어야 합니다. Builder 패턴은 더 깔끔한 접근 방식을 제공합니다.
public class User {
private final String name; // 필수
private final String email; // 필수
private final int age; // 선택
private final String phone; // 선택
private User(UserBuilder builder) {
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
this.phone = builder.phone;
}
public static class UserBuilder {
private final String name;
private final String email;
private int age;
private String phone;
public UserBuilder(String name, String email) {
this.name = name;
this.email = email;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public User build() {
return new User(this);
}
}
}Builder의 메서드는 this를 반환하므로 메서드 체이닝이 가능합니다. 이는 객체를 생성하는 유창하고 읽기 쉬운 방법입니다.
User user = new User.UserBuilder("Alice", "alice@email.com")
.age(25)
.phone("555-1234")
.build();User Constructor가 private이라는 점에 주목하세요. 객체는 Builder를 통해서만 생성할 수 있습니다. 이 패턴은 객체에 optional 필드가 많을 때 특히 유용하며, 긴 parameter 목록을 사용하는 것보다 코드를 더 읽기 쉽고 오류가 발생할 가능성도 줄여 줍니다.
챌린지
쉬움Builder Pattern을 사용하여 피자 주문 시스템을 만들어 봅시다! 가능한 모든 토핑과 옵션을 위한 수십 개의 매개변수를 받는 constructor를 다루는 대신, 피자 사용자 지정을 깔끔하고 읽기 쉽게 만드는 유창한 builder를 만들 것입니다.
코드를 두 개의 파일로 구성합니다:
Pizza.java: construction에 Builder Pattern을 사용하는Pizzaclass를 만드세요. 피자에는 다음 fields가 있어야 합니다:size(String) - 필수이며, 피자 크기를 나타냅니다cheese(boolean) - optional이며, 기본값은 false입니다pepperoni(boolean) - optional이며, 기본값은 false입니다mushrooms(boolean) - optional이며, 기본값은 false입니다Pizzaconstructor는 private이어야 하며,PizzaBuilder만 parameter로 받아 builder의 모든 값을 피자의 fields에 복사해야 합니다.getDescription()method를 포함하세요. 이 method는 다음 형식의 string을 반환합니다:[size] Pizza with: [toppings]. 여기서 toppings는 true인 토핑(Cheese, Pepperoni, Mushrooms)을 쉼표로 구분한 목록입니다. 선택된 토핑이 없으면 toppings 부분에는no toppings만 표시해야 합니다.다음 항목을 포함하는 static inner class
PizzaBuilder를 만드세요:- 필수
sizeparameter를 받는 constructor - 각각 해당 boolean을 true로 설정하고 chaining을 위해
this를 반환하는cheese(),pepperoni(),mushrooms()methods - 새로운
Pizza를 반환하는build()method
- 필수
Main.java: pizza builder가 실제로 동작하는 모습을 보여 주세요! 네 개의 inputs를 받습니다. 피자 크기(String)와 cheese, pepperoni, mushrooms를 각각 추가할지 나타내는 세 개의 yes/no 값(Strings)입니다.주어진 size로
PizzaBuilder를 만드세요. 그런 다음 각 yes/no input에 따라 적절한 토핑 methods를 chain으로 호출하세요. input이"yes"이면 해당 토핑 method를 호출하고,"no"이면 건너뜁니다. 마지막으로build()를 호출하여 피자를 만드세요.완성된 피자에서
getDescription()을 호출한 결과를 출력하세요.
다음 순서로 네 개의 inputs를 받습니다: size (String), add cheese (String: "yes" 또는 "no"), add pepperoni (String: "yes" 또는 "no"), add mushrooms (String: "yes" 또는 "no").
예를 들어 inputs가 Large, yes, no, yes라면 출력은 다음과 같습니다: Large Pizza with: Cheese, Mushrooms
Builder Pattern을 사용하면 각 경우에 대해 별도의 constructors를 만들 필요 없이 어떤 조합의 토핑이든 피자를 만들 수 있다는 점에 주목하세요!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String size = scanner.nextLine();
String addCheese = scanner.nextLine();
String addPepperoni = scanner.nextLine();
String addMushrooms = scanner.nextLine();
// TODO: 주어진 크기로 PizzaBuilder 생성하기
// TODO: yes/no 입력에 따라 토핑 메서드 체이닝하기
// TODO: 피자를 빌드하고 설명 출력하기
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러