코틀린

Do it! 코틀린 프로그래밍, 09-3 Set과 Map 활용하기

조요피 2021. 9. 2. 23:22

Set은 정해진 순서가 없는 요소들의 집합을 나타내는 컬렉션.

List의 경우 값이 중복되더라도 요소로 저장할 수 있지만

Set의 경우에는 집합의 개념이기 때문에 동일한 요소를 중복해서 가질 수 없다.

다시 말하면 모든 요소가 유일해야 한다.

 

Map은 키와 값의 쌍으로 저장된다.

키는 중복될 수 없고 유일하다.

하지만 값은 중복해서 사용할 수 있다.

Set 생성

헬퍼 함수인 setOf()를 이용해 불변형 Set을 생성하고

mutableSetOf()를 이용해 가변형 Set을 생성할 수 있다.

val set1 = setOf("hi", 1, 2.3, 'c') // 자료형 혼합
val set2: Set<Int> = setOf<Int>(1, 3, 4) // 정수형만 초기화

mutableSetOf()는 MutableSet 인터페이스 자료형을 반환하는데 내부적으로 자바의 LinkedHashSet을 만든다.

fun main() {
    val set3 = mutableSetOf(1, 2, 3)
    set3.add(1) // 이미 있는 요소라서 의미 없음
    set3.add(4) // 추가됨
    set3.remove(2) // 삭제

    println(set3)
}

//[1, 3, 4]

Set의 여러 가지 자료구조

hashSetOf()

해시 테이블이란 내부적으로 키와 인덱스를 이용해 검색과 변경 등을 매우 빠르게 처리할 수 있는 자료구조.

hashSetOf()는 HashSet을 반환하는데 HashSet은 불변성 선언이 없기 때문에 추가 및 삭제 등의 기능을 수행할 수 있다.

sortedSetOf()

자바의 TreeSet 컬렉션을 정렬된 상태로 반환.

TreeSet은 저장된 데이터의 값에 따라 정렬되는데, 일종의 개선된 이진 탐색 트리인 레드 블랙 트리 알고리즘을 사용해 자료구조를 구성한다.

기존의 이진 탐색 트리가 한쪽으로 치우친 트리 구조를 가지게 되는 경우 트리 높이만큼 시간이 걸리게 되는 최악의 경우가 생긴다.

레드 블랙 트리는 요소를 빨간색과 검은색으로 구분해 치우친 결과 없이 트리의 요소를 배치한다.

따라서 최악으로 요소 배치가 되어도 검색등의 처리에서 일정한 시간을 보장하는 자료구조.

HashSet보다 성능이 떨어지고 데이터 추가/삭제에 시간이 더 걸리지만 검색과 정렬이 뛰어나다.

linkedSetOf()

자바의 LinkedHashSet 자료형을 반환하는 헬퍼 함수.

저장된 순서에 따라 값이 정렬된다.

HashSet, TreeSet보다 느리지만 저장 공간을 효율적으로 사용할 수 있다.

Map의 활용

내부적으로 자바의 Map을 이용하고 있다.

키와 값으로 구성된 요소를 저장하며 키와 값은 모두 객체이다.

fun main() {
    val m = mapOf(1 to 1, 2 to "hi")
    for((k, v) in m) {
        println("$k, $v")
    }

    println(m[1])
    println(m.get(1))
    println(m.keys)

    println("/////////////////////////////////////")

    val m2 = mutableMapOf<String, String>("1" to "2", "2" to "3")

    m2.remove("1")
    m2.put("4", "5")

    println(m2)
}

//1, 1
//2, hi
//1
//1
//[1, 2]
///////////////////////////////////////
//{2=3, 4=5}

Map의 기타 자료구조

Map에도 자바의 HashMap, SortedMap, LinkedHashMap을 사용할 수 있다.

hashMapOf(), sortedMapOf(), linkedMapOf()로 각각 초기화할 수 있다.

SortedMap은 기본적으로 키에 대해 오름차순으로 정렬된다.