ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 34장 - 기본 생성자에 이름 있는 옵션 아규먼트를 사용하라
    Kotlin/Effective Kotlin 요약 2023. 3. 20. 00:01

    객체를 생성하고 사용하는 가장 기본적인 방법

    class User(var name: Stirng, var surname: String)
    val user = User("Marcin", "Moskala")

    이처럼 객체의 초기 상태를 나타내는 아규먼트를 전달합니다.

     

    데이터 모델 객체

    data class Student(
    	val name: String,
    	val surname: String,
    	val age: Int,
    )

     

     

    하지만 생성자에 선언된 아규먼트 이외에도 클래스의 필드로도 프로퍼티를 가질 수 있습니다.

    이럴 때는 어떻게든 초기화된 되면 상관없습니다.

     

    일반적으로 기본생성자가 제일 좋은 방식인 이유를 이해하려면, 점층적 생성 패턴과 빌더 패턴에 대해 이해하는 것이 좋습니다.

     

    점층적 생성 패턴

    class Pizza{
        val size: String
        val cheese: Int
        val olives: Int
        val bacon: Int
    
        constructor(size: String, cheese: Int, olives: Int, bacon: Int){
            this.size = size
            this.cheese = cheese
            this.olives = olives
            this.bacon = bacon
        }
    
        constructor(size: String, cheese: Int, olives: Int):
                this(size, cheese, olives, 0)
        constructor(size: String, cheese: Int):
                this(size, cheese,0)
        constructor(size: String):
                this(size, 0)
    }
    
    fun main() {
        val pizza = Pizza("1")
        println(pizza.size)
        println(pizza.cheese)
        println(pizza.olives)
        println(pizza.bacon)
    }

     

    코틀린에서는 일반적으로 디폴트 아규먼트를 지원하기 때문에 위의 코드는 좋은 코드가 아닙니다.

    class Pizza(
        val size: String,
        val cheese: Int = 0,
        val olives: Int = 0,
        val bacon: Int = 0,
    )
    
    fun main() {
        val pizza = Pizza("1", olives = 3)
        println(pizza.size)
        println(pizza.cheese)
        println(pizza.olives)
        println(pizza.bacon)
    }

    훨씬 깔끔해졌으며 훨씬 다양한 기능을 제공합니다.

    위처럼 size와 olives의 개수를 지정할 수 있습니다.

     

    파라미터 값을 원하는 대로, 순서를 원하는 대로 지정할 수 있습니다.

    이름을 붙여 아규먼트를 지정해서 의미도 훨씬 명확해집니다.

     

    val villagePizza = Pizza("L", 1, 2, 3)

    코드가 짧지만 무슨 의미인지 이해할 수 있나요?

     

    이름 있는 아규먼트를 활용하면 이제 이해할 수 있습니다.

    val villagePizza = Pizza(
            size = "L",
            cheese = 1,
            olives = 3,
            bacon = 2,
        )

     

    빌더 패턴

    빌더 패턴을 사용하면 다음과 같은 이점을 가질 수 있습니다.

    • 파라미터에 이름을 붙일 수 있다
    • 파라미터를 원하는 순서로 지정할 수 있다
    • 디폴트 값을 지정할 수 있다

    하지만 코틀린의 이름 있는 야규먼트와, 디폴트 아규먼트를 활용하면 이런 장점을 모두 누릴 수 있습니다.

     

    빌더패턴을 사용하는것보다 이름 있는 파라미터를 사용하면 다음과 같은 장점이 있습니다.

    • 더 짧다
    • 더 명확하다
    • 더 사용하기 쉽다
    • 동시성과 관련된 문제가 없다(코틀린의 함수 파라미터는 항상 immutable)

     

    기본 생성자를 사용하는 것보다 빌더 패턴이 더 좋은 경우

    • 값의 의미를 묶어서 지정하는 경우
    • 특정 값을 누적해서 사용하는 경우

     

    보통 코틀린 커뮤니티에서는 DSL 빌더를 사용하곤 합니다.

    전통적인 빌더 패턴보다 훨씬 유연하고 명확하다는 장점이 있지만 만들기 어렵다는 단점이 있습니다.

     

    결론적으로 코틀린에서는 빌더 패턴을 거의 사용하지 않으며 다음과 같은 경우에만 사용합니다.

    • 빌더 패턴을 사용하는 다른 언어로 작성된 라이브러리를 그대로 옮길 때
    • 디폴트 아규먼트와 DSL을 지원하지 않는 다른 언어에서 쉽게 사용할 수 있게 API를 설계할 때

     

     

     

     

    댓글

Designed by Tistory.