Kotlin에서는 데이터를 그룹화해서 효율적으로 사용할 수 있도록 Collection을 제공합니다.

 

Collection type 설명
List
MutableList
순서가 있는 값(item)들의 모음
Set
MutableSet
순서가 없는 값(item)들의 모음. Set 내에서 값(item)이 중첩될 수 없음
Map
MutableMap
key-value pair의 모음. key는 Map 내에서 unique한 값으로 오직 하나의 value로 매핑

 

각 Collection은 mutable 또는 read only 분류됩니다. 즉 변경가능한, 변경불가능한 collection입니다.

 

List

List는 순서대로 값을 저장하며, 저장되는 값이 같더라도 허용합니다.

 

읽기만 가능한 List는 listOf, 변경가능한 MutlableList는 mutableListOf로 생성할 수 있습니다.

위의 예제처럼 List는 변경할 수 없으며, 읽기만 가능합니다. 반면, MutalbleList는 값을 삭제하거나, 변경하거나, 더할 수 있습니다.

 

List는 순서가 있는 구조이기 때문에 indexed acess opertor [] 를 사용할 수 있습니다. 또한 first(), last() function을 이용해서 첫번째 혹은 마지막 값(item)에 접근할 수 있습니다. 그리고 count() funtion을 통해 저장된 값(item)의 갯수를 알 수 있습니다.

val readOnlyFruits = listOf("사과", "귤", "포도")
println("첫 번째 과일은 ${readOnlyFruits[0]}입니다.")
//첫번째 과일은 사과입니다.

println("첫 번째 과일은 ${readOnlyFruits.first()}입니다.")
//첫번째 과일은 사과입니다.

println("마지막 과일은 ${readOnlyFruits.last()}입니다.")
//첫번째 과일은 포도입니다.

println("담겨져있는 과일 종류의 수는 ${readOnlyFruits.count()}개입니다.")
//첫번째 과일은 사과입니다.

 

List안에 특정 값(item)이 포함되어있는지 확인할때는 in operator를 사용합니다.

val readOnlyFruits = listOf("사과", "귤", "포도")
println("포도" in readOnlyFruits) //포도가 있으면 true, 없으면 false
//true

 

MutableList에서 값을 더하기 위해선 add(),삭제하기 위해서는 remove()를 사용합니다.

val fruits = mutableListOf("사과", "귤", "포도")
fruits.add("딸기")
println(fruits)
//[사과, 귤, 포도, 딸기]

fruits.remove("귤")
println(fruits)
//[사과, 포도, 딸기]

 

첨언을 하자면 List, MutableList 모두 val로 선언했습니다. 왜 MutableList는 var이 아닌데 변경 가능한지 헷갈릴 수도 있습니다.

MutalbeList의 내부에 값이 변경되는 것이지 MutableList 자체가 변경되는 것이 아납니다. 다시 말해 그릇은 그대로 있고 그 안의 내용물만 바뀌는 겁니다. val로 선언한 것이 바로 그릇 MutableList이고 변경한것은 그 안의 값(item)들입니다.

아래의 예시가 적절한 예제는 아니지만 개념 이해를 돕는것으로는 도움이 될 것 같습니다.

val valFruits = mutableListOf("사과", "귤", "포도")
//valFruits = mutableListOf("사과", "귤", "포도") //ERROR!! val은 한번 생성하면 변경할 수 없는 값입니다.
    
var varFruits = mutableListOf("사과", "귤", "포도")
varFruits = mutableListOf("사과","귤","포도") //var은 변경할 수 있습니다.

 


Set

List와 유사하지만 다른점이 있다면, Set은 순서를 중요시하지 않습니다. 대신에 중첩된 값을 받아들이지 않습니다.

 

읽기만 가능한 Set은 setOf, 변경가능한 MutlableSetd은 mutableSetOf로 생성할 수 있습니다.

중복 item 정리됨

 

Set과 MutableSet은 item의 순서가 없기때문에 indexed access operator []를 사용할 수 없습니다. 주의하세요!!!

count(), add(), remove() funtion과 in operator는 List와 동일하게 사용가능합니다.


Map

Map은 key-value 쌍을 저장하는데 사용합니다. 

key에서 느껴지듯이 key 값은 Map 내에서 유일(unique)해야합니다. value는 중첩될수 있습니다.

key-value 쌍 예를 들어 보면

kbs1, 9

kbs2, 7 

mbc, 11

sbs, 6

이렇게 예를 들 수 있겠네요.

kbs1은 9번 채널, kbs2는 7번 채널, mbc는 11번 채널, sbs는 6번 채널 입니다.

그럼 이걸 어떻게 표현할까요?

Map 생성을 통해 알아보겠습니다.

 

읽기만 가능한 Map은 mapOf, 변경가능한 MutlableMap은 mutableMapOf로 생성할 수 있습니다.

예를 들어 String을 Key로하고 Int를 Value로 하는 경우 < >을 사용하여 data sturcture을 명시할 수 있습니다.

Map<String, Int>, MutableMap<String, Int>

 

가장 쉬운 key-value pair 생성 방식은 to 를 사용하는 방법입니다.

// Read-only map
val readOnlyChannel = mapOf("KBS1" to 9, "MBC" to 11, "SBS" to 5)
println(readOnlyChannel)
// {KBS1=9, MBC=11, SBS=5}

// Mutable map with explicit type declaration
val channel: MutableMap<String, Int> = mutableMapOf("KBS1" to 9, "MBC" to 11, "SBS" to 5)
println(channel)
// {apple=100, kiwi=190, orange=100}

 

List와 동일하게 Map의 value에 접근하는 방법은 indexed access operator []을 사용하는 것입니다. count()의 사용법도 List와 동일합니다. 

 

Map에서는 key-value pair 추가를 위해 put(), 삭제를 위해 remove() function을 사용합니다.

val channel = mutableMapOf("KBS1" to 9, "MBC" to 11, "SBS" to 5)
channel.put("KBS2", 7)
println(channel)
// {KBS1=9, MBC=11, SBS=5, KBS2=7}

channel.remove("SBS") // key를 사용하여 삭제
println(channel)
// {KBS1=9, MBC=11, KBS2=7}

 

Map에서 key를 포함하고 있는지 확인하는 function containsKey()를 제공합니다. 

val channel = mutableMapOf("KBS1" to 9, "MBC" to 11, "SBS" to 5)
println(channel.containsKey("MBC")) //key가 존재하면 true, 없으면 false
// true

 

Map에서 key와 value를 각각 확인할 수도 있습니다. keys와 values를 사용하여 얻을 수 있습니다.

val channel = mutableMapOf("KBS1" to 9, "MBC" to 11, "SBS" to 5)
println(channel.keys)
// [KBS1, MBC, SBS]
println(channel.values)
// [9,11,5]

 

+ Recent posts