코틀린(Kotlin)

코틀린(kotlin) : 코틀린의 Collections - List, Set, Map

알통몬_ 2019. 8. 21. 16:05
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


2019/08/21 - [코틀린(Kotlin)] - 코틀린(kotlin) : 코틀린의 Collections - read only, mutable


지난 포스팅에 이어 Collection에 대해 공부합니다. 

예전에도 Collection의 List, Set, Map 에 대해 포스팅한 적이 있는데 이번에는

조금 더 자세하게 포스팅 해보려 합니다.

 

Collection

Collection<T> 는 collection 체계의 가장 머리, root 입니다.

이 인터페이스는 읽기 전용 collection의 공통적인 동작을 나타냅니다.

(크기 검색, item 체크, 기타 등등)


collection은 요소 반복 작업을 정의하는 Iterable<T> 인터페이스를 상속받습니다.

Collection 타입 파라미터에 Collection<T>를 상속 받는 다른 collections 타입을

사용할 수 있습니다.

ex)

package com.example.kotlinplayground

fun printAll(strings: Collection<String>) {
for(s in strings) print("$s ")
println()
}

fun main() {
val stringList = listOf("one", "two", "one")
printAll(stringList)

val stringSet = setOf("one", "two", "three")
printAll(stringSet)
}


MutableCollection 은 Collection에 add, remove 와 같은 쓰기 작업이 가능합니다.

package com.example.kotlinplayground

fun List<String>.getShortWordsTo(shortWords: MutableList<String>, maxLength: Int) {
this.filterTo(shortWords) { it.length <= maxLength }
// throwing away the articles
val articles = setOf("a", "A", "an", "An", "the", "The")
shortWords -= articles
}

fun main() {
val words = "A long time ago in a galaxy far far away".split(" ")
val shortWords = mutableListOf<String>()
words.getShortWordsTo(shortWords, 3)
println(shortWords)
}

=====================================================

List

List<T> 는 요소를 저장할 때 순서대로 저장하며, index를 제공해 요소에 접근할 수

있도록 합니다. index는 0부터 시작하고 마지막 index는 요소 갯수 - 1입니다.

package com.example.kotlinplayground

fun main() {
val numbers = listOf("첫 번째", "두 번째", "세 번쨰", "네 번째")
println("Number of elements: ${numbers.size}")
println("Third element: ${numbers[2]}")
println("Fourth element: ${numbers[3]}")
println("Index of element \"two\" ${numbers.indexOf("two")}")
}

실행결과)

Number of elements: 4

Third element: 세 번쨰

Fourth element: 네 번째

Index of element "two" -1


List의 요소들은 null을 포함하고 중복될 수 있습니다 :

List에는 동일한 여러 개의 객체들 또는 단일 객체의 생성이 포함될 수 있습니다.

만약 두 개의 List의 요소가 동일한 위치에 동일한 크기와 구조적으로 동일한 요소가

있는 경우 두 List는 동일한 것으로 간주됩니다.

package com.example.kotlinplayground


data class Study(var subject : String, var pages : Int)

fun main() {

val subject1 = Study("수학", 200)
val subject2 = listOf<Study>(Study("과학", 200), subject1, subject1)
val subject3 = listOf<Study>(Study("과학", 200), Study("수학", 200), subject1)

println(subject2 == subject3)
subject1.pages = 220
println(subject2 == subject3)
}

실행결과)

true

false


MutableList

특정 position의 요소들을 add, remove 등의 쓰기 작업이 가능한 List 입니다.

package com.example.kotlinplayground


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


여기까지 보시면 느끼셨을 수도 있는데, list는 arrays와 유사합니다.

하지만 중요한 다른 한 가지가 있는데요. arrays의 사이즈는 arrays를 정의할 때

같이 정해지고, 추후에 변경이 불가능하지만, list는 크기를 따로 지정하지 않고,

adding, removing, updating 등의 결과에 따라 사이즈가 변경될 수 있습니다.

코틀린에서 기본 list의 구현은 ArrayList 이고 resizable array 라고 생각하시면 됩니다.

=====================================================

[ 광고 보고 가시죠! ]



[ 감사합니다! ]

=====================================================

Set

Set<T> 에 저장되는 요소는 유니크 합니다; 그리고 순서가 따로 없습니다.

null 값 또한 유니크하기 때문에 한 개만 가질 수 있습니다.

두 개의 Set 이 크기가 같고, 모든 요소들이 같다면 같은 것으로 간주됩니다.

예제)

package com.example.kotlinplayground


fun main() {
val numbers = setOf(1, 2, 3, 4)
println("Number of elements: ${numbers.size}")
if (numbers.contains(1)) println("1 is in the set")

val numbersBackwards = setOf(4, 3, 2, 1)
println("The sets are equal: ${numbers == numbersBackwards}")
}

실행결과)

Number of elements: 4

1 is in the set

The sets are equal: true


MutableSet은 
MutableCollection으로부터 나온 쓰기작업이 가능한 Set입니다.

Set의 기본 구현은 LinkedHashSet 입니다.

해당 Set은 요소의 입력된 순서를 지킵니다.

따라서 first(), last() 와 같은 순서와 관련된 functions를 사용할 수 있습니다.

예제)

package com.example.kotlinplayground


fun main() {
val numbers = setOf(1, 2, 3, 4) // LinkedHashSet is the default implementation
val numbersBackwards = setOf(4, 3, 2, 1)

println(numbers.first() == numbersBackwards.first())
println(numbers.first() == numbersBackwards.last())
}

실행결과)

false

true


HashSet도 있습니다.

LinkedHashSet 처럼 순서와 관련된 functions는 사용할 수 없지만,

같은 양의 요소가 저장되어 있을 때 더 적은 메모리를 사용합니다.


=====================================================

Map

Map<K, V> 는 Collection 인터페이스를 구현하지 않지만,

kotlin colleciton type 이라고 합니다.

Map은 Key 와 Value 쌍으로 저장됩니다.

Key는 유니크하지만 Value는 각 다른 Key 에 동일한 Value가 들어갈 수 있습니다.

Map 인터페이스는 특별한 functions들을 제공합니다.

Key로 Value에 접근하거나, Key 와 Value를 찾거나, 기타 등등.

예제)

package com.example.kotlinplayground


fun main() {
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)

println("All keys: ${numbersMap.keys}")
println("All values: ${numbersMap.values}")
if ("key2" in numbersMap) println("Value by key \"key2\": ${numbersMap["key2"]}")
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
}

실행결과)

All keys: [key1, key2, key3, key4]

All values: [1, 2, 3, 1]

Value by key "key2": 2

The value 1 is in the map

The value 1 is in the map


두 Map 이 같은 Key 와 Value 쌍을 가진다면, 

순서에 상관 없이 같은 것으로 간주됩니다.

예제)

package com.example.kotlinplayground


fun main() {
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("The maps are equal: ${numbersMap == anotherMap}")
}

실행결과)

The maps are equal: true


MutableMap 은 쓰기 작업이 가능한 Map입니다.

예를 들어 새로운 Key-Value 쌍을 추가하거나, 기존의 값을 변경할 수 있습니다.

package com.example.kotlinplayground


fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2)
numbersMap["three"] = 3 // Key 가 존재하지 않으면 put 이 됩니다.
numbersMap["one"] = 11 // Key 가 존재하면 update 가 됩니다.

println(numbersMap)
}


LinkedHashMap 은 Map의 기본 구현입니다.

입력된 요소의 순서를 지킵니다.  HashMap의 경우 요소 입력 순서를 알 수 없습니다.

반응형