App노자
[Kotlin] Set과 Map 본문
1. Set이란?
Set은 정해진 순서가 없는 요소들의 집합을 나타내는 컬렉션이다
List와 달리 동일한 요소를 중복해서 가질 수 없고 모든 요소가 유일한 값이어야 한다
헬퍼 함수인 setOf()을 이용해 불변형 Set을 생성하고 mutuableSetOf()를 사용해 가변형 Set을 생성할 수 있다
https://kotlinlang.org/docs/kotlin-tour-collections.html#set
Collections | Kotlin
kotlinlang.org
2. 불변형 Set
fun main() {
val mixedTypesSet = setOf("Hello", 5, "world", 3.14, 'c') // 자료형 혼합 초기화
var intSet: Set<Int> = setOf<Int>(1, 5, 5) // 정수형만 초기화
println(mixedTypesSet)
println(intSet)
}
setOf()의 함수는 읽기 전용인 불변형 Set<T> 자료형을 반환한다
setOf()에서는 자료형을 혼합하거나 특정 자료형을 지정할 수 있다
중복 요소를 허용하지 않으므로 중복된 요소는 결과에서 하나만 나타난다
3. 가변형 Set
fun main() {
// 가변형 Set 정의하기
val animals = mutableSetOf("Lion", "Dog", "Cat", "Python", "Hippo")
println(animals)
// 요소의 추가
animals.add("Dog") // 이미 존재하므로 변화 없음
println(animals)
// 요소의 삭제
animals.remove("Python")
println(animals)
}
mutableSetOf() 함수로 요소의 추가 및 삭제가 가능한 가변형 Set을 만들 수 있다
mutableSetOf() 함수는 mutableSet 인터페이스 자료형을 반환하는데 내부적으로 Java의 LinkedHashSet을 만들어 낸다
가변형 Set에서 이미 존재하는 요소를 추가하려고 하면 요소의 변화 없이 유지된다
4. Set의 여러 가지 자료구조
//hashSetOf()
fun main() {
// 자바의 java.util.HashSet 선언
val intsHashSet: HashSet<Int> = hashSetOf(6, 3, 4, 7)
intsHashSet.add(5)
intsHashSet.remove(6)
println(intsHashSet)
}
헬퍼 함수 hashSetOf()을 통해
해시 테이블 (내부적으로 키와 인덱스를 이용해 검색과 변경을 빠르게 처리할 수 있는 자료구조)
에 요소를 저장할 수 있는 Java의 HashSet컬렉션을 만든다
hashSetOf()는 HashSet를 반환하며 추가 및 삭제 등의 기능을 수행할 수 있다
입력 순서와 중복된 요소는 무시하고 따로 정렬 기능은 없지만 해시값을 통해 요소를 찾아내므로 데이터 양과 상관없이
항상 일정한 실행시간으로(빅 오 표기법으로 O(1)의 상수 시간을 갖는다) 필요한 값을 요청과 즉시 바로 찾아낼 수 있다
//sortedSetOf()
fun main() {
// 자바의 java.util.TreeSet 선언
val intsSortedSet: TreeSet<Int> = sortedSetOf(4, 1, 7, 2)
intsSortedSet.add(6)
intsSortedSet.remove(1)
println("intsSortedSet = ${intsSortedSet}")
intsSortedSet.clear() // 모든 요소 삭제
println("intsSortedSet = ${intsSortedSet}")
}
sortedSetOf() 함수는 Java의 TreeSet컬렉션을 정렬된 상태로 반환한다
TreeSet는 저장된 데이터의 값에 따라 정렬되는데 레드 블랙 트리 알고리즘을 사용해 자료구조를 구성한다
HashSet보다 성능이 떨어지고 데이터를 추가하거나 삭제하는 데 시간이 걸리지만 검색과 정렬이 뛰어나다는 장점을 가지고 있다
//linkerSetOf()
fun main() {
// Linked List를 이용한 HashSet
val intsLinkedHashSet: java.util.LinkedHashSet<Int> = linkedSetOf(35, 21, 76, 26, 75)
intsLinkedHashSet.add(4)
intsLinkedHashSet.remove(21)
println("intsLinkedHashSet $intsLinkedHashSet")
intsLinkedHashSet.clear()
println(intsLinkedHashSet)
}
Java의LinkedHashSet 자료형을 반환하는 헬퍼 함수이다
Linked list를 사용해 구현된 해시 테이블에 요소를 저장한다
저장된 순서에 따라 값이 정렬되면 위에 두 자료구조에 비해 느리지만 메모리 저장 공간을 좀 더 효율적으로 사용할 수 있다
5. Map이란?
Map은 내부적으로 Java의 Map을 이용하고 있으며 키(Key)와 값(Value)으로 구성된 요소를 저장한다
키과 값은 모두 객체이며 키는 중복될 수 없지만 값은 중복 저장 될 수 있다
만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체된다
https://kotlinlang.org/docs/kotlin-tour-collections.html#map
Collections | Kotlin
kotlinlang.org
6. 불변형 Map
fun main() {
// 불변형 Map
val langMap: Map<Int, String> = mapOf(11 to "Java", 22 to "Kotlin", 33 to "C++")
for ((key, value) in langMap) { // 키와 값의 쌍을 출력
println("key=$key, value=$value")
}
println("langMap[22] = ${langMap[22]}") // 키 22에 대한 요소 출력
println("langMap.get(22) = ${langMap.get(22)}") // 위와 동일한 표현
println("langMap.keys = ${langMap.keys}") // 맵의 모든 키 출력
}
Map의 값 출력하기 위해 대괄호를 사용할때는 인덱스가 아닌 키를 사용한다
키 내용을 지정하면 해당 요소의 값을 가져올수 있다
7. 가변형 Map
fun main() {
// 가변형 Map
val capitalCityMap: MutableMap<String, String> // 선언 시 키와 값의 자료형을 명시할 수 있음
= mutableMapOf("Korea" to "Seoul", "China" to "Beijing", "Japan" to "Tokyo")
println(capitalCityMap.values)
println(capitalCityMap.keys)
capitalCityMap.put("UK", "London")
capitalCityMap.remove("China")
println(capitalCityMap)
// putAll()을 사용한 맵의 추가
val addData = mutableMapOf("USA" to "Washington")
capitalCityMap.putAll(addData)
println(capitalCityMap)
}
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] 컬렉션의 확장 함수 (0) | 2023.08.04 |
---|---|
[Kotlin] sequence (시퀀스) (0) | 2023.08.03 |
[Kotlin] List (0) | 2023.07.22 |
[Kotlin] Array 클래스 (0) | 2023.07.21 |
[Kotlin] 제네릭(Generic) (0) | 2023.06.18 |