본문 바로가기
Kotlin/Kotlin 프로그래밍

[Kotlin] 컬렉션(Collection) - Set, Map

by 주 녕 2021. 5. 26.
반응형

모든 내용은 Do it! 코틀린 프로그래밍을 바탕으로 정리한 것입니다. 

컬렉션(Collection)

컬렉션은 자주 사용하는 기초적인 자료구조를 모아 놓은 일종의 프레임워크로 표준 라이브러리로 제공하고 있음

컬렉션에 대한 자세한 내용은 아래 포스팅 참고!

 

[Kotlin] 컬렉션(Collection) - List

모든 내용은 Do it! 코틀린 프로그래밍을 바탕으로 정리한 것입니다. 컬렉션(Collection) 컬렉션은 자주 사용하는 기초적인 자료구조를 모아 놓은 일종의 프레임워크로 표준 라이브러리로 제공하고

junyoung-developer.tistory.com

 

Set

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

List의 경우 값이 중복되도 요소로 저장할 수 있지만, Set은 집합의 개념이기 때문에 동일한 요소를 중복해서 가질 수 없음

 

불변형 Set

setOf() 메서드

fun main() {
    val mixedTypeSet = setOf("Hello", 5, "world", 3.14, 'c')
    var intSet: Set<Int> = setOf<Int>(1, 2, 3, 3, 4)

    println(mixedTypeSet)  // [Hello, 5, world, 3.14, c]
    println(intSet)  // [1, 2, 3, 4]
}
  • setOf()는 불변형 Set<T> 자료형을 반환함
  • 자료형을 혼합하거나 특정 자료형을 지정할 수 있음
  • 중복 요소를 허용하지 않음

 

가변형 Set

mutableSetOf() 메서드

fun main() {
    val animals = mutableSetOf("Lion", "Dog", "Cat", "Python", "Hippo")
    println(animals)  // [Lion, Dog, Cat, Python, Hippo]

    animals.add("Dog")
    println(animals)  // [Lion, Dog, Cat, Python, Hippo]

    animals.remove("Python")
    println(animals)  // [Lion, Dog, Cat, Hippo]
}
  • MutableSet 인터페이스 자료형을 반환하고, 내부적으로 자바의 LinkedHashSet을 만듦
  • add()와 remove()로 요소의 추가와 삭제가 가능하고, 요소는 유일해야 함

 

Set의 자료구조

hashSetOf() 메서드

fun main() {
    val intsHashSet: HashSet<Int> = hashSetOf(6, 3, 4, 1)
    intsHashSet.add(5)
    intsHashSet.remove(1)
    println(intsHashSet)  // [3, 4, 5, 6]
}
  • hashSetOf()를 통해 해시 테이블에 요소를 저장할 수 있는 자바의 HashSet 컬렉션을 만듦
    • 해시 테이블 : 내부적으로 키와 인덱스를 이용해 검색과 변경 등을 매우 빠르게 처리할 수 있는 자료구조
  • hashSetOf()는 HashSet를 반환하는데 HashSet은 가변성
  • 입력 순서와 중복된 요소는 무시하며, 따로 정렬 기능은 없음
  • 해시값을 통해 요소를 찾아내기 때문에 검색 속도는 O(1)의 상수 시간을 갖음 == 요청과 즉시 바로 찾아냄

 

sortedSetOf() 메서드

import java.util.*

fun main() {
    val intsSortedSet: TreeSet<Int> = sortedSetOf(4, 1, 6, 3)
    intsSortedSet.add(7)
    intsSortedSet.remove(1)
    println("intsSortedSet = ${intsSortedSet}")  // intsSortedSet = [3, 4, 6, 7]

    intsSortedSet.clear()
    println("intsSortedSet = ${intsSortedSet}")  // intsSortedSet = []
}
  • 자바의 TreeSet 컬렉션을 정렬된 상태로 반환함
    • TreeSet은 저장된 데이터 값에 따라 정렬함
    • 일종의 개선된 이진 탐색 트리(Binary-search Tree)인 레드 블랙 트리(RB tree) 알고리즘을 사용해 구성된 자료구조
    • 기존의 이진 탐색 트리가 한쪽으로 치우친 트리 구조를 가지게 되는 경우, 트리 높이만큼 시간이 걸리게 되는 최악의 경우가 생김. 레드 블랙 트리는 요소를 빨간색과 검은색으로 구분해 치우친 결과 없이 트리의 요소를 배치함
  • HashSet보다 성능이 떨어지고 데이터를 추가/삭제하는데 시간이 걸리지만 검색과 정렬이 뛰어남 
  • TreeSet도 가변성만 사용할 수 있으므로 요소의 추가/삭제 등이 가능함

 

linkedSetOf() 메서드

fun main() {
    val intsLinkedHashSet: java.util.LinkedHashSet<Int> = linkedSetOf(11, 23, 63, 47, 13)
    intsLinkedHashSet.add(3)
    intsLinkedHashSet.remove(11)

    println(intsLinkedHashSet)  // [23, 63, 47, 13, 3]
    intsLinkedHashSet.clear()
    println(intsLinkedHashSet)  // []
}
  • 자바의 LinkedHashSet 자료형을 반환함
  • 링크드 리스트(linked list) 자료구조를 사용해 구현된 해시 테이블에 요소를 저장함
    • 노드들은 다음 연결 노드 포인터를 갖고 있고 메모리 영역이 연속적이지 않아도 비어 있는 공간을 참조해 다음 데이터를 가리킬 수 있음 → 메모리 저장 공간을 효율적으로 사용할 수 있음
    • 자료의 추가/삭제가 O(1)의 시간에 가능함
  • 저장된 순서에 따라 값이 정렬되며 HashSet, TreeSet보다 느림

 


 

Map

내부적으로 자바의 Map을 사용하고 있으며 요소가 키와 값의 쌍 형태로 저장되는 컬렉션키는 중복될 수 없고 유일하지만, 값은 중복해서 사용할 수 있음 (키와 값은 객체)기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체됨

 

불변형 Map

mapOf() 메서드

fun main() {
    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]}")  // langMap[22] = Kotlin
    println("langMap.get(22) = ${langMap.get(22)}")  // langMap.get(22) = Kotlin
    println("langMap.keys = ${langMap.keys}")  // langMap.keys = [11, 22, 33]
}
  • 키와 값의 쌍 - 키 to 값
  • Map의 값을 출력하기 위해 대괄호를 사용할 때는 인덱스가 아닌 키를 사용함
   size    Map 컬렉션의 크기를 반환함
   keys    Set의 모든 키를 반환함
   values    Set의 모든 값을 반환함
   isEmpty()    Map이 비어 있는지 확인하고 비어있으면 true, 아니면 false를 반환함
   containsKey(key: K)    인자에 해당하는 키가 있으면 true, 없으면 false를 반환함
   containsValue(value: V)    인자에 해당하는 값이 있으면 true, 없으면 false를 반환함
   get(key: K)    키에 해당하는 값을 반환하며, 없으면 null을 반환함

 

 

가변형 Map

mutableMapOf() 메서드

fun main() {
    val capitalCityMap: MutableMap<String, String>
            = mutableMapOf("Korea" to "Seoul", "China" to "Beijing", "Japan" to "Tokyo")
    println(capitalCityMap.values)  // [Seoul, Beijing, Tokyo]
    println(capitalCityMap.keys)  // [Korea, China, Japan]

    capitalCityMap.put("UK", "London")
    capitalCityMap.remove("China")
    println(capitalCityMap)  // {Korea=Seoul, Japan=Tokyo, UK=London}

    val addData = mutableMapOf("USA" to "Washington")
    capitalCityMap.putAll(addData)
    println(capitalCityMap)  // {Korea=Seoul, Japan=Tokyo, UK=London, USA=Washington}
}
  • mutableMapOf()는 가변형 Map
  • MutableMap(K, V) 인터페이스 자료형을 반환함
  • MutableMap은 MutableCollection을 상속받지 않고 Map에서 확장되었음
   put(key: K, value: V)    키와 값의 쌍을 Map에 추가
   remove(key: K)    키에 해당하는 요소를 Map에서 제거
   putAll(from: Map<out K, V>)    인자로 주어진 Map 데이터를 갱신하거나 추가
   clear()    모든 요소를 지움

 

 

Map의 자료 구조

  • HashMap
  • SortedMap - 키에 대해 오름차순으로 정렬된 형태
  • LinkedHashMap

→ 내부 구조는 Set과 비슷하게 해시, 트리, 링크드 리스트의 자료구조로 구현되어 있음

fun main() {
    val hashMap: HashMap<Int, String> = hashMapOf(1 to "Hello", 2 to "World")
    println("hashMap = $hashMap")  // hashMap = {1=Hello, 2=World}
    
    val sortedMap: SortedMap<Int, String> = sortedMapOf(1 to "Apple", 2 to "Banana")
    println("sortedMap = $sortedMap")  // sortedMap = {1=Apple, 2=Banana}
    
    val linkedHash: LinkedHashMap<Int, String> = linkedMapOf(1 to "Computer", 2 to "Mouse")
    println("linkedHash = $linkedHash")  // linkedHash = {1=Computer, 2=Mouse}
}

 

 

반응형

댓글