천원의 개발

Swift Builder 패턴 정리 본문

iOS&Swift🍎

Swift Builder 패턴 정리

천 원 2024. 6. 4. 16:11

안녕하세요. 천원입니다.

오늘은 오픈소스들의 코드를 학습하면서 만난 Builder 패턴에 대해서 학습해 보겠습니다.

 

 

Builder 패턴

복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴을 의미합니다. 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식입니다.

 

 

예제

설명으로 만 보면 감이 안 잡힐 테니 예제를 함께 보면, 아래와 같은 Student 클래스에 대한 객체를 생성하는 Builder를 만들어 보겠습니다.

final class Student {
    private var name: String
    private var age: String
    private var phoneNumber: Int
    
    init(name: String, age: String, phoneNumber: Int) {
        self.name = name
        self.age = age
        self.phoneNumber = phoneNumber
    }
    
    public func getInformation() -> String {
        return "Name: \(name), Age: \(age), Phone Number: \(phoneNumber)"
    }
}

 

 

 

 

각 멤버들을 초기화 해주는 메서드와 해당 멤버들을 가지고 Student인스턴스를 리턴하는 Build 메서드를 만들어 줍니다.

final class StudentBuilder {
    private var name: String = ""
    private var age: String = ""
    private var phoneNumber: Int = 0
    
    public func setName(name: String) -> Self {
        self.name = name
        return self
    }
    
    public func setAge(age: String) -> Self {
        self.age = age
        return self
    }
    
    public func setPhoneNumber(phoneNumber: Int) -> Self {
        self.phoneNumber = phoneNumber
        return self
    }
    
    public func build() -> Student {
        return Student(name: name, age: age, phoneNumber: phoneNumber)
    }
}

 

 

 

이제 Builder를 통해서 인스턴스를 생성하면 아래와 같이 SwiftUI와 같은 선언적으로 프로그래밍 형태로 구현이 가능합니다.

let jae = StudentBuilder()
    .setName(name: "Jae")
    .setAge(age: "24")
    .setPhoneNumber(phoneNumber: 1234567890)
    .build()

let yoon = StudentBuilder()
    .setName(name: "Yoon")
    .setAge(age: "25")
    .setPhoneNumber(phoneNumber: 9876543210)
    .build()
    
print(yoon.getInformation())

 

 

 

장점

생성자를 통해서 인스턴스를 생성해도 될텐데 builder 패턴을 통해서 생성하는 이유가 무엇일까요?

 

먼저 객체 생성 과정을 일관된 프로세스로 표현할 수 있습니다. 생성자를 통해세 객체를 생성하게 된다면 매개변수가 많아 질수록 가독성이 떨어지게 되지만 빌더 패턴을 적용하면 직관적으로 어떤 값이 설정되는지 파악이 가능합니다.

 

다음으로는 최초 인스턴스를 생성 시에만 내부 값들을 변경 후 build메서드를 통해서 인스턴스를 생성하기 때문에 인스턴스가 만들어진 후에는 외부에서 변경이 불가능하여 새로운 기능에 대해서도 수정이나 추가가 용이합니다.

 

마지막으로 customAlert과 같이 공통적으로 사용한는 Class들을 builder 패턴을 통해서 구현해두면 사용하는 쪽에서 set 메서들을 통하여 필요한 매개변수들을 초기화하여 재사용적으로 효율적이게 사용이 가능합니다.

 

 

 

 

여기까지 Builder 패턴 정리였습니다.

'iOS&Swift🍎' 카테고리의 다른 글

iOS Privacy Manifest  (1) 2024.04.29
IOS ObservableObject  (0) 2022.05.19
IOS Firebase에서 데이터 가져오기  (0) 2022.04.04
IOS Firebase에 데이터 추가 하기  (0) 2022.04.02
IOS TableView 커스텀  (0) 2022.03.31