티스토리 뷰

목차

    ■ 선택적 메서드 호출 (optional method call)


    안드로이드 코틀린에서 Optional한 값의 메소드를 호출할 때


    • 값이 있으면 메소드 호출
    • null이면 null이 원하지 않아도 if 조건문 진입 가능


    다음과 같이 작성할 수 있습니다.



    1
    2
    3
    4
    fun hoge(user: User?) {
        val name: String= user?.name
        println("name=$name")
    }
    cs



    elvis 연산자를 사용하면 null에 해당하는 기본값을 지정할 수 있습니다.



    1
    2
    3
    4
    fun hoge(user: User?) {
        val name: String = user?.name ?: "no name"
        println("name=$name")
    }
    cs



    Swift에도 메소드 호출 시 ? 사용할 수 있습니다. 또한 Swift에서는 elvis가 ?? 입니다.


    안드로이드 코틀린과 스위프트는 많이 닮았지만, ?을 한개 또는 두개 사용할 때 파싱 트리(parsing tree)가 다릅니다.


    사용자 이름 길이(문자 개수) 얻는 경우를 생각해 보겠습니다.



    1
    2
    3
    4
    5
    6
    class User {
        var name: String = "vicddory"
    }
    fun hoge(user: User?) {
        println(user?.name?.length())
    }
    cs



    Kotlin에서는 ? 가 두 번 나옵니다. 이것은 다음과 같이 해석되기 때문입니다.



    1
    ( user?.name )?.length()
    cs



    ? 없이 쓰면 다음과 같습니다.



    1
    2
    val name: String= if (user != null) { user.name } else { null }
    val length: Int? = if (name != null) { name.length } else { null }
    cs



    한편, Swift의 경우는 다음과 같습니다.



    1
    2
    3
    4
    5
    6
    7
    class User {
        var name: String = "vicddory"
    }
    func hoge(user: User?) {
        print(user?.name.characters.count)
    }
    main()
    cs



    name 뒤의 ? 가 스위프트에선 .(dot)으로 되어 있습니다. 이것은 다음과 같이 해석되기 때문입니다.



    1
    user?.(name.characters.count)
    cs



    그러나 괄호는 개념을 설명하기 위한 것이며, Swift에선 부정됩니다.


    다시 작성하면 다음과 같습니다.



    1
    2
    3
    4
    5
    if let user = user {
        return user.name.characters.count
    else {
        return nil
    }
    cs



    안드로이드 코틀린 선택적 메소드 호출(Optional method)


    정리하면 다음과 같습니다.


    • Kotlin ? 결과는 하나의 키워드만 처리하고, 결과를 오른쪽에서 사용합니다.
    • Swift ? 오른쪽 모두를 묶어 처리하며, None인 경우 오른쪽 모두를 건너뜁니다.


    똑같은(거의 유사한) 코드가 전혀 다른 의미를 가지므로,  소스 코드를 이식할 때 주의가 필요합니다.


    개인적으로 Kotlin이 더 직관적이라 좋습니다. 스위프트를 처음 사용할 때, 코틀린처럼 구현하다 에러가 자주 발생해 혼란스러웠던 적이 있었네요.



    관련 글

    2019/07/06 - 안드로이드 코틀린 장점, 쉬운 도입과 자바 연계성

    2019/07/07 - 안드로이드 코틀린 Smart casts 소스, Swift Java 비교

    2019/07/09 - 안드로이드 코틀린 Nullable, Unsafe cast 예제



    ⓒ written by vicddory