공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
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
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
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의 경우 요소 입력 순서를 알 수 없습니다.
'코틀린(Kotlin)' 카테고리의 다른 글
[코틀린/Kotlin] Convert Kotlin to JSON/JSON to Kotlin (0) | 2023.03.10 |
---|---|
코틀린 return should be lifted out of 'when' 노란 줄 해결하기 (0) | 2019.11.13 |
코틀린(kotlin) : 코틀린의 Collections - read only, mutable (1) | 2019.08.21 |
코틀린 Scope Functions[2] - [ let, run, with, apply, also ] 사용 예제 + takeIf, takeUnless (0) | 2019.07.16 |
코틀린 Scope Functions - [ let, run, with, apply, also ] (0) | 2019.07.16 |