반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

안드로이드 개발자 노트

[이펙티브 코틀린] Item17. 이름 있는 아규먼트를 사용하라 본문

Kotlin/이펙티브 코틀린

[이펙티브 코틀린] Item17. 이름 있는 아규먼트를 사용하라

어리둥절범고래 2023. 10. 29. 21:27
반응형

이름있는 아규먼트(네임드 파라미터)를 사용하면 코드가 길어지지만, 두 가지 장점이 생깁니다.

 

  • 이름을 기반으로 값이 무엇을 나타내는지 알 수 있습니다.
  • 파라미터 입력 순서와 상관 없으므로 안전합니다.

 

예제를 통해 살펴보겠습니다.

val text = (1..10).joinToString("|")

 

joinToString에 대해 이미 알고 있다면, "|"이 구분자(separator)를 의미한다는 것을 알 것입니다.

해당 함수에 대해서 잘 모른다면, 한눈에 파라미터가 명확하지 않게 보일 수도 있습니다.

파라미터가 명확하지 않은 경우에는 이를 직접 지정해서 명확하게 만들어 줄 수 있습니다.

val text = (1..10).joinToString(separator = "|")

 

파라미터에 변수를 사용해서 더욱 의미를 명확하게 할 수 있습니다.

doSomething(300)

val SYSTEM_READY = 300
doSomething(responseCode = SYSTEM_READY)

 

DSL 문법을 활용할 수도 있습니다.

sleep(100.ms)

 

 

함수 타입 파라미터는 조금 특별하게 다루어야 합니다.

코틀린은 함수 타입을 파라미터 마지막에 위치하면 다음과 같이 블록을 바깥으로 뺄 수 있습니다.

fun main() {
    method(3, { i -> i + 1 })
    method(3) { i -> i + 1 }
}

fun method(a: Int, block: (Int) -> Int) {
    /*...*/
}

 

모든 함수 타입 아규먼트는 이름 있는 아규먼트를 사용하는 것이 좋습니다.

val view = linerLayout {
    text("Click below")
    button(onClick = {/*...*/ }) {
        /*...*/
    }
}

 

여러 함수 타입의 옵션 파라미터가 있는 경우에는 더 헷갈립니다.

fun call(before: () -> Unit = {}, after: () -> Unit = {}) {
    before()
    print("Middle")
    after()
}

// 이름을 붙여서 사용하면, 훨씬 더 가독성이 좋아진다.
call(before = { print("CALL") }) // CALLMiddle
call(after = { print("CALL") })  // MiddleCALL

 

함수 타입 파라미터는 Rxjava에서 Observable을 구독할 때 자주 볼 수 있는 형태입니다.

 

  • 각각의 아이템을 받을 때 (onNext)
  • 오류가 발생했을 때 (onError)
  • 전체가 완료되었을 때 (onComplete)

 

observable.getUsers()
        .subscribe((List<User> users) -> { // onNext
            // ...
        }, (Throwable throwable) -> { // onError
            // ...
        }, () -> { // onComplete
            // ...
        })

 

아래와 같이 이름 있는 아규먼트를 활용해서 의미를 더 명확하게 할 수 있습니다.

observable.getUser()
    .subscribeBy(
        onNext = { user: List<User> ->
            // ...
        }
        onError = { throwable: Thorwable ->
            // ...
        }
        onCompleted = {
            // ...
        }
    )

 

 


정리

 

  • 이름 있는 아규먼트는 개발자가 코드를 읽을 때도 편리하게 활용되며, 코드의 안정성도 향상시킬 수 있다.
  • 함수에 같은 타입의 파라미터가 있는 경우, 함수 타입의 파라미터가 있는 경우, 옵션 파라미터가 있는 경우에는 이름 있는 아규먼트를 활용하는 것이 좋다.
  • 마지막 파라미터가 DSL처럼 특별한 의미를 갖고 있는 경우는 예외이다.
반응형