본 글은 https://kotlinlang.org/docs/home.html 를 기반으로 작성자 마음대로 번역한 글입니다.
오역 & 의역이 빈번하며 모든 질문 및 태클 환영합니다!
2022-01-19 기준으로 작성되었습니다.
is and !is operators
객체가 주어진 유형에 맞는지 런타임 확인이 필요하다면, is 연산자, 부정은 !is 연산자를 사용하세요:
Smart casts
코틀린은 많은 상황에서 컴파일러가 is 체크와 명시적 캐스트↗를 추적하고 필요할 때 (안전한) 캐스트를 자동으로 사용하므로 명시적인 캐스트 연산자를 사용할 필요가 없습니다:
코틀린은 부정 검사가 return으로 이어질 경우 캐스트가 안전하다는 것을 알만큼 똑똑합니다.
&&와 ||의 우측에서도 마찬가지입니다.
스마트 캐스트는 when expressions↗과 while loops↗에서도 작동합니다.
스마트 캐스트는 변수가 확인하고 사용하는 사이에 변하지 않는 것을 컴파일러가 보장할 때만 작동합니다. 더 자세한 다음의 규칙을 따릅니다.
- val 지역 변수 - local delegated properties↗에서는 항상 적용됩니다.
- val 프로퍼티 - 프로퍼티가 private이나 internal이거나 또는 프로퍼티가 선언된 같은 모듈↗에서 검사되었을 경우 적용됩니다. open 프로퍼티나 커스텀 getter를 갖는 경우에는 적용되지 않습니다.
- var 지역 변수 - 람다식 안에서 수정되거나 로컬 위임 프로퍼티가 아닐 때 검사와 사용 사이에 변수가 수정되지 않은 경우 적용됩니다.
- var 프로퍼티 - 변수가 다른 코드에 의해 언제든지 수정될 수 있기 때문에 절대로 적용되지 않습니다.
"Unsafe" cast operator
일반적으로, 캐스트 연산자는 캐스트가 불가능하다면 예외를 발생시키기 때문에 unsafe라고 불립니다. 코틀린에서의 안전하지 않은 캐스트는 중위 연산자인 as에 의해 수행됩니다.
이 타입은 nullable↗이기 때문에 null이 String으로 캐스트 될 수 없다는 것을 기억해야합니다. 만약 y가 null이라면, 상단의 코드는 예외를 발생시킬 것입니다. null 값에도 맞는 코드를 만들기 위해서는 캐스트의 우측에도 nullable 타입을 사용해야합니다.
"Safe" (nullable) cast operator
예외를 방지하기 위해, 캐스트에 실패하면 null을 반환하는 safe cast 연산자인 as?를 사용하십시오.
as?의 우측이 non-null 타입의 String인 경우에도, 캐스트의 결과는 nullable입니다.
Type erasure and generic type checks
코틀린은 컴파일 타임에 generic↗을 포함하여 작업의 타입 안정성을 보장하지만 런타임에는 제네릭 타입의 인스턴스는 실제 타입 인수에 대한 정보를 가지고 있지 않습니다. 예를 들어 List<Foo>는 그저 List<*>이 됩니다. 일반적으로 런타임에 인스턴스가 특정 타입의 인수를 가지는 제네릭 타입에 속하는지 확인할 방법은 없습니다.
그러므로 컴파일러는 타입을 지우기 위한 런타임에 실행할 수 없는 ints is List<Int> 혹은 list is T (타입 파라미터)와 같은 is-checks를 금지합니다. 그러나 star-projected type↗으로 인스턴스를 검사할 수 있습니다.
비슷하게, (컴파일 타임에) 정적으로 검사된 타입 인자를 가지고 있다면, is 검사 혹은 타입의 non-generic 부분을 포함하는 캐스트가 가능합니다. 이 케이스에서 꺽쇠괄호 (<,>)는 생략되었습니다:
타입 인자가 생략된 동일한 구문은 타입 인자를 고려하지 않는 캐스트에 사용될 수 있습니다:list as ArrayList
reified type parameter↗가 있는 인라인 함수는 모든 호출 부분에서 실제 타입 인자가 존재합니다. 이것은 타입 파라미터에 대한 arg is T 검사를 가능하게 하지만 arg가 제네릭 타입 자신의 인스턴스라면 타입은 여전히 제거되어 있습니다.
Unchecked casts
위에서 설명했듯이, 타입 제거는 런타임에 불가능한 제네릭 타입 인스턴스의 실제 타입 인자 검사를 가능하게 합니다. 추가적으로, 코드 상의 제네릭 타입은 컴파일러가 타입 안정성을 확보하기에 충분할 정도로 밀접하지 않을 수 있습니다.
그렇다 하더라도, 타입 안정성을 암시하는 높은 수준의 프로그램 로직이 있을 수 있습니다.
마지막 줄에서 캐스트에 대한 경고가 발생합니다. 컴파일러는 런타임에 전체적으로 검사할 수 없으며 map 안의 값이 모두 Int라는 보장 또한 할 수 없습니다.
확인되지 않은 캐스트를 예방하기 위해, 프로그램 구조를 다시 디자인할 수 있습니다: 위의 예시에서는, 다른 타입에 대한 안전한 타입 구현을 위해 DictionaryReader<T>와 DictionaryWriter<T> 인터페이스를 사용할 수 있습니다. 확인되지 않은 캐스트를 상세하게 구현하기 위해 합리적인 추상화를 도입할 수 있습니다. generic variance↗의 사용이 도움이 될 것입니다.
제네릭 함수에서, reified type parameters↗의 사용은 arg의 타입이 제거된 자신의 타입 인자를 가지고 있지 않다고 해도 arg as T와 같은 검사를 가능하게 합니다.
확인되지 않은 캐스트의 경고는 구문이나 선언에 @Suppress("UNCHECKED_CAST") 를 annotating↗함으로써 막을 수 있습니다.
On JVM : array types↗(Array<Foo>)는 요소의 제거된 타입에 대한 정보를 유지하고 배열 타입에 대한 타입 캐스트는 부분적으로 검사됩니다 : null의 가능성과 요소들의 타입의 실제 타입 인자는 여전히 제거되어 있습니다. 예를 들어, foo as Array<List<String>?>의 캐스트는 foo가 List<*>를 가진 배열이라면 null이던 아니던 성공할 것입니다.
https://kotlinlang.org/docs/typecasts.html
Type checks and casts | Kotlin
kotlinlang.org
'Kotlin > Docs' 카테고리의 다른 글
[Kotlin Docs] Returns and jumps (0) | 2022.01.19 |
---|---|
[Kotlin Docs] Conditions and loops (0) | 2022.01.19 |
[Kotlin Docs] Basic types (0) | 2022.01.18 |
[Kotlin Docs] Coding conventions (0) | 2022.01.17 |
[Kotlin Docs] Idioms (0) | 2022.01.15 |