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

■ 선택적 메서드 호출 (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

이 글을 공유하기

댓글(0)

Designed by JB FACTORY