[Kotlin] 5-2. 콜렉션

콜렉션: List, Set, Map

코틀린은 변경 가능한 콜렉션과 불변 콜렉션을 구분한다

val numbers: MutableList<Int> = mutableListOf(1, 2, 3)
val readOnlyView: List<Int> = numbers
println(numbers)  // "[1, 2, 3]" 출력
numbers.add(4)
println(readOnlyView)  // prints "[1, 2, 3, 4]"
readOnlyView.clear()  // 컴파일 안 된다

val strings = hashSetOf("a", "b", "c", "c")
assert(strings.size == 3)   // assert: 값 체크

코틀린은 리스트나 집합을 생성하기 위한 전용 구문 구성 요소가 없다. listOf() , mutableListOf() , setOf() , mutableSetOf()와 같은 표준 라이브러리에 있는 메서드를 사용해서 생성한다.
성능이 중요하지 않은 코드에서는 간단한 이디엄인 mapOf(a to b, c to d)를 사용해서 맵을 생성할 수 있다

리스트에 존재하는 유일한 참조가 읽기 전용 타입이면, 콜렉션이 완전히 불변이라고 간주할 수 있다

val items = listOf(1, 2, 3)

현재 listOf 메서드는 배열 리스트를 사용해서 구현하는데, 앞으로는 리스트가 바뀌지 않는다는 사실을 이용해서 메모리에 더 효율적인 완전히 불변인 콜렉션 타입을 리턴하도록 구현할 것이다.

리스트나 맵은 유용하게 쓸 수 있는 다양한 확장 메서드를 제공하는데, 이들 메서드에 익숙해지면 좋다

val items = listOf(1, 2, 3, 4)
items.first() == 1
items.last() == 4
items.filter { it % 2 == 0 }  // [2, 4]를 리턴

val rwList = mutableListOf(1, 2, 3)
rwList.requireNoNulls()   // [1, 2, 3]을 리턴 
// (requireNoNulls() -> 인자의 null 체크를 해주고 null이 아닐시 그대로 반환, 
// null 일 경우 NPE를 발생시킨다)
if(rwList.none {it>6}) println("no items above 6")  // "no items above 6" 출력
val item = rwList.firstOrNull()

맵은 다음 패턴을 따른다. 다음과 같이 쉽게 생성하고 접근할 수 있다

val readWriteMap = hashMapOf("foo" to 1, "bar" to 2)
println(readWriteMap["foo"])  // "1"을 출력
val snapshot: Map<String, Int> = HashMap(readWriteMap)