객체 생성은 단순히 'new'로 끝나지 않을 때가 많다.
특히 필드가 많고, 일부는 선택적(optional)이거나 생성 순서가 중요하다면 생성자는 매우 복잡해진다.
이 문제를 해결하는 대표적인 방법이 Builder 패턴이다.

Builder 패턴
Builder 패턴은 복잡한 객체를 단계적으로 캡슐화하여, 클라이언트가 직관적이고 유연하게 객체를 구성할 수 있도록 돕는 패턴이다.
클라이언트는 객체 생성 과정을 직접 다루지 않고, 다만 "어떻게 만들지"에 집중하여 객체를 유연하게 제어할 수 있다.
Builder
package org.example.builder
class User private constructor (
val name: String,
val age: Int,
val email: String?,
val phone: String?,
val address: String?
) {
class Builder(private val name: String, private val age: Int) {
private var email: String? = null
private var phone: String? = null
private var address: String? = null
fun email(email: String) = apply { this.email = email }
fun phone(phone: String) = apply { this.phone = phone }
fun address(address: String) = apply { this.address = address }
fun build() = User(name, age, email, phone, address)
}
override fun toString(): String {
return "User(name=$name, age=$age, email=$email, phone=$phone, address=$address)"
}
}
fun main() {
val user = User.Builder("Gildong Hong", 30)
.email("hong@test.com")
.address("Seoul")
.build()
println(user.toString())
}
특징
- 가독성 향상
- Method chaining으로 생성자 오버로딩 문제 해결
※ 생성자 오버로딩 : 객체에 담긴 변수(=정보)의 수가 커짐에 따라 그 수의 제곱 만큼 개별 생성자가 요구되는 상황 - 불변 객체 (Immutable object) 생성에도 적합하다.
DSL-Like Builder
Kotlin의 'apply'나 'DSL'을 활용하면 훨씬 간결하게 Builder 패턴을 구현할 수 있다.
- apply
- Kotlin 표준 라이브러리에 존재하는 스코프 함수
- 객체를 만들고, 그 안에서 바로 값을 설정할 수 있도록 돕는다.
- DSL (Domain Specific Language)
- "특정 목적을 위한 언어"
- Kotlin 에서는 코드 구조를 읽기 쉬운 문장처럼 작성하게 해주는 기법을 의미한다.
package org.example.builder
data class User(
var name: String = "",
var age: Int = 0,
var email: String? = null,
var phone: String? = null,
var address: String? = null
)
fun user(block: User.() -> Unit): User = User().apply(block)
fun main() {
val user = user {
name = "Gildong Hong"
age = 30
email = "hong@test.com"
address = "Seoul-city"
}
println(user)
}
Powered By. ChatGPT
'Backend' 카테고리의 다른 글
| [Backend] Observer 패턴 (1) | 2025.09.03 |
|---|---|
| [Backend] Singleton 패턴 (1) | 2025.09.03 |
| [Backend] Factory 패턴 (1) | 2025.09.03 |
| [Backend] 객체지향 디자인 패턴 (1) | 2025.09.03 |
| [Backend] Git & GitHub 소개 (0) | 2025.09.02 |