본문 바로가기
Language/Kotlin

Builder 패턴이란? (feat. Kotlin의 코드 간결성 찬양)

by 시니성 2023. 8. 17.

Builder 패턴은 객체 생성 과정과 표현 방식을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 생성할 수 있게 하는 패턴입니다.
복잡한 객체의 생성과정을 단계별로 나눠 명확하게 표현하며, 필요한 경우에만 특정 메소드를 호출하여 객체를 생성할 수 있습니다.

Java에서의 Builder 패턴 예제

public class Computer {
    private String CPU;
    private String RAM;
    private String storage;

    private Computer(Builder builder) {
        this.CPU = builder.CPU;
        this.RAM = builder.RAM;
        this.storage = builder.storage;
    }

    public static class Builder {
        private String CPU;
        private String RAM;
        private String storage;

        public Builder setCPU(String CPU) {
            this.CPU = CPU;
            return this;
        }

        public Builder setRAM(String RAM) {
            this.RAM = RAM;
            return this;
        }

        public Builder setStorage(String storage) {
            this.storage = storage;
            return this;
        }

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

사용 예:

Computer computer = new Computer.Builder()
                        .setCPU("Intel i9")
                        .setRAM("32GB")
                        .setStorage("1TB SSD")
                        .build();

Kotlin에서의 대안적 방법들

Kotlin은 다양한 언어 기능을 통해 객체 생성을 더 간결하고 직관적으로 할 수 있습니다.

1. Named Arguments와 Default Arguments

Kotlin에서는 named arguments와 default arguments를 통해 객체 생성시 필요한 인자만 전달하고, 나머지 인자에는 기본값을 사용할 수 있습니다.

data class Computer(
    val CPU: String = "Default CPU",
    val RAM: String = "Default RAM",
    val storage: String = "Default Storage"
)

val computer = Computer(CPU = "Intel i9", RAM = "32GB")

2. Apply

Kotlin에서 apply 함수를 사용하여 객체 생성 후 초기화 과정을 좀 더 읽기 좋게 만들 수 있습니다.

data class Computer(var CPU: String? = null, var RAM: String? = null, var storage: String? = null)

val computer = Computer().apply {
    CPU = "Intel i9"
    RAM = "32GB"
    storage = "1TB SSD"
}

결론

Java에서는 Builder 패턴을 사용하여 복잡한 객체의 생성 과정을 명확하게 표현할 수 있습니다.
반면, Kotlin에서는 named arguments, default arguments, apply와 같은 언어 기능을 활용하여 객체 생성과 초기화 과정을 더욱 간결하게 표현할 수 있습니다.
Kotlin의 이러한 기능들은 코드의 가독성을 높이며, 객체 생성과정을 더 직관적으로 만들어 줍니다.