티스토리 뷰
목차
■ 선택적 메서드 호출 (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 |
정리하면 다음과 같습니다.
- Kotlin ? 결과는 하나의 키워드만 처리하고, 결과를 오른쪽에서 사용합니다.
- Swift ? 오른쪽 모두를 묶어 처리하며, None인 경우 오른쪽 모두를 건너뜁니다.
똑같은(거의 유사한) 코드가 전혀 다른 의미를 가지므로, 소스 코드를 이식할 때 주의가 필요합니다.
개인적으로 Kotlin이 더 직관적이라 좋습니다. 스위프트를 처음 사용할 때, 코틀린처럼 구현하다 에러가 자주 발생해 혼란스러웠던 적이 있었네요.
관련 글
2019/07/06 - 안드로이드 코틀린 장점, 쉬운 도입과 자바 연계성
2019/07/07 - 안드로이드 코틀린 Smart casts 소스, Swift Java 비교
2019/07/09 - 안드로이드 코틀린 Nullable, Unsafe cast 예제
ⓒ written by vicddory