Kotlin - Grammar(Collections)

정현철·2023년 4월 16일
0

Android App

목록 보기
4/6
post-thumbnail

Kotlin Docs - Collections overview

Overview

Collections란, 여러 개의 변수(0개일 수도 있다)를 모아둔 그룹을 뜻하는데, kotlin에서는 기본형으로 set, list, map을 지원한다. Collection 안에서도 read-only interface와 mutable interface로 구분된다.

  • read-only interface: 내부 요소에 access하는 operation만 지원하는 Collections
  • mutable interface: 요소를 adding, removing, updating까지 지원하는 read-only의 확장판.
    • mutable collection은 var로 선언할 수 없다.
val numbers = mutableListOf("one", "two", "three", "four")
numbers.add("five") // 이렇게 메서드로 제어해야 함
println(numbers)
numbers = mutableListOf("six", "seven") // compilation error

List

List는 특정 순서에 맞게 elements를 저장하는 collection으로, index는 0부터 시작하며 list.size - 1이 마지막 element이다.

  • 중복된 요소를 담을 수 있고, ==연산도 가능하다.
    • 두 list가 같은 size이며, 동일한 index에 있는 요소가 같을 때 true.
val numbers = listOf("one", "two", "three", "four")
println("Number of elements: ${numbers.size}") // 4
println("Third element: ${numbers.get(2)}") // three
println("Fourth element: ${numbers[3]}") // four
println("Index of element \"two\" ${numbers.indexOf("two")}") // 1

val bob = Person("Bob", 31)
val people = listOf(Person("Adam", 20), bob, bob)
val people2 = listOf(Person("Adam", 20), Person("Bob", 31), bob)
println(people == people2) // true
bob.age = 32
println(people == people2) // false

mutableList
자바의 ArrayList기반으로 구현된, add, remove가 가능한 list. 이러한 메서드를 write operation이라고 부른다.

val numbers = mutableListOf(1, 2, 3, 4)
numbers.add(5)
numbers.removeAt(1)
numbers[0] = 0
numbers.shuffle()
println(numbers) // [3, 5, 0, 4]

Set

unique elements만 저장하는 collection. 그래서 내부 요소들에게 순서라는 개념은 없다. null도 들어갈 수 있는데, 위와 같은 특성으로 인해서 null 역시 딱 한 개만 저장할 수 있다.

  • 그래서 index로 내부의 데이터를 직접 접근할 수는 없고, 데이터가 존재하는지 확인하는 용도로 사용한다.
  • 두 set의 size가 같고, 내부 요소가 다 동일할 때 ==연산의 값이 true가 된다.
val numbers = setOf(1, 2, 3, 4)
println("Number of elements: ${numbers.size}") // 4
if (numbers.contains(1)) println("1 is in the set") // 출력됨

val numbersBackwards = setOf(4, 3, 2, 1)
println("The sets are equal: ${numbers == numbersBackwards}") // true
  • 그런데 setOf()로 생성되는 set은 java의 linkedHashSet이다. 그러므로 first(), last()메서드 호출이 가능하다.
val numbers = setOf(1, 2, 3, 4)  // LinkedHashSet is the default implementation
val numbersBackwards = setOf(4, 3, 2, 1)

println(numbers.first() == numbersBackwards.first()) // false
println(numbers.first() == numbersBackwards.last()) // true

mutableSet

add등 mutableCollection의 메서드를 사용할 수 있는 set이다.

val mutSet = mutableSetOf(1, 2, 3)
mutSet.add(5) // 가능

Map

map<K, V>Collection interface의 inheritor는 아니다. 그렇지만 코틀린에서는 collection type으로 다루어진다.
기본적으로 key-value의 pairs(혹은 entries라고도 부름)을 저장한다. 여기서 key는 unique해야 하지만, 서로 다른 key에 종속된 value는 같아도 된다.

  • 같은 key-value pair를 포함하는 두 map은, 순서에 관계없이 == 결과 true이다.
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)

println(numbersMap.keys) // [key1, key2, key3, key4]
println(numbersMap.values) // [1, 2, 3, 1]
if ("key2" in numbersMap) println(numbersMap["key2"])   // 2 
if (1 in numbersMap.values) println("The value 1 is in the map") // 출력됨
if (numbersMap.containsValue(1)) println("The value 1 is in the map") // same as previous

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)    
val anotherMap = mapOf("key2" to 2, "key1" to 1, "key4" to 1, "key3" to 3)
println(numbersMap == anotherMap) // true

mutableMap

위 list, set과 동일하다. 새로운 key-value pair를 저장하거나 key에 할당된 value를 저장하거나 할 수 있다.

val numbersMap = mutableMapOf("one" to 1, "two" to 2)
numbersMap.put("three", 3)
numbersMap["one"] = 11

println(numbersMap)
// {one=11, two=2, three=3}

0개의 댓글