App노자

[Kotlin] Set과 Map 본문

Android/Kotlin

[Kotlin] Set과 Map

앱의노예 2023. 7. 30. 09:46

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