본문 바로가기

IT/kotlin언어

[드로이드나이츠] 뱅크샐러드 코틀린던전 2, 3번문제

안녕하세요 남갯입니다


오늘은 드로이드나이츠에서 나온 뱅크샐러드의 코틀린던전 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 MutableListat 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이 나오게됩니다.