안녕하세요 남갯입니다
오늘은 드로이드나이츠에서 나온 뱅크샐러드의 코틀린던전 2번 3번문제를 풀어보려합니다.
2번문제는 되게 어려웠습니다.
실제로 확인하는데는 엄청 어려웠습니다.
listof
일단 listof에 대해 확인해보면
listof는 emptyList 혹은 elements.asList를 통해 결과값을 반환합니다. List<T>타입을 반환하게 되죠
asList
emptyList
위의 두 반환타입을 보면 List<T>타입을 반환하게 되는데
즉 List<T>라는 immutable한 타입을 반환하게 됩니다.
arratListOf
반환타입이 ArrayList를 반환하게 됩니다.
List, MutableList , ArrayList 살펴보기
List
MutableList
ArratList
List는 Collection을 상속받았고
MutableList는 List를 상속받았습니다.
ArrayList는 Mutablelist를 상속받았습니다.
위의 코드를 테스트 해보도록 하겠습니다.
테스트코드를 통해 알아보기
interface mList<out T> {
fun get()
}
interface mMutableList<T> : mList<T>{
fun add()
}
저는 이런코드를 생성했습니다.
val a : mList<String>
val b : mMutableList<String>
a = object : mList<String>{
override fun get() {
}
}
b = object : mMutableList<String>{
override fun get() {
}
override fun add() {
}
}
println("t1 : " + (a is mList<*>))
println("t2 : " + (a is mMutableList<*>))
println("t3 : " + (b is mList<*>))
println("t4 : " + (b is mMutableList<*>))
후에 mList Interface 와 mMutableList interface를 생성하여 구현하고
찍어보았습니다
결과는? 예상되시나요?
true / false / true / true가 나오게됩니다.
그렇다면 위의 문제에서 확인해보도록 하겠습니다.
X의 정답
println(x is List<*>)
println(x is MutableList<*>)
println(x is java.util.List<*>)
는 예상을 해보자면
true / false /true가 나와야합니다.
왜냐하면
List is List
List is MutableList
List is java.util.List
인거니까요
하지만 결과는
true / true / true가 나오게됩니다.
????????????
https://stackoverflow.com/questions/52580173/listof-returns-mutablelist
오랜시간 검색결과
위의 링크를 타고 들어가게되면 답을 확인 가능합니다.
The separation between List
and MutableList
is an illusion created by the Kotlin compiler. At runtime, Kotlin uses Java collection classes, which only have a single List
interface containing both read and mutation methods. Compile-time references to List
and MutableList
are both compiled to java.util.List
references. Therefore, it's not possible to detect whether a list is a MutableList
at runtime.
즉 컴파일 타임에서 java.util.List로 컴파일 되기때문에 같은걸로 인식한다는 점이죠
정답은 그래서
true / true / ture 였습니다.
Y의 정답
println(y is List<*>)
println(y is MutableList<*>)
println(y is java.util.List<*>)
위의 테스트코드로 확인이 가능하듯이
true / true / ture 가 나옵니다.
결론
true / true / true / true / true / true
라는 문제였습니다
우리가 확인해야할것은 4..1은 과연 어떻게 동작하는가에 대한 확인을 해봐야합니다.
저코드를 동일하게 작성할경우 위와같은 경고가 뜨게됩니다
이 범위는 비어있어 너는 downTo를 쓰려했던거 아냐?
이경고를 보고 바로 IntRange에 대해 알아봤습니다.
IntRange
앞숫자가 뒷숫자보다 작을경우 empty 없는 처리를 하게됩니다.
즉 in 안에 있는 4..1은 정상적으로 동작하지 않게되는거죠
!in 또한 정상적으로 동작하지 않게됩니다 empty기 때문이죠
그래서 정답은 else가 나오게됩니다.
*1..4의 코드였으면 in이 나오게됩니다.
'IT > kotlin' 카테고리의 다른 글
[코틀린] let, with, run, also, apply 정리 (0) | 2019.12.05 |
---|---|
[Kotlin] 코틀린 확장 함수 (Kotlin extension functions) 예제 및 정리 (0) | 2019.08.08 |
[드로이드나이츠] 뱅크샐러드 코틀린던전 1번문제 (2) | 2019.04.08 |
[kotlin] 제너릭 변성(variance) 정리 (1) | 2019.03.26 |
[코틀린] Higher order function 정리 (0) | 2019.02.20 |