컬렉션 (Collection) (1/2)

장똑대·2022년 4월 22일
0

Do it! 코틀린 프로그래밍 [셋째마당, 코틀린 표준 라이브러리의 활용] 학습

컬렉션(Collection)이란? 자주 사용하는 기초적인 자료구조를 모아 놓은 일종의 프레임워크

📌 코틀린의 컬렉션

  • 컬렉션의 종류 : List, Set, Map 등
  • 자바와는 다르게 불변형(immutable)과 가변형(mutable)로 나뉨
    • 불변형 -> 데이터를 한번 할당하면 읽기 전용이 됨
    • 가변형 -> 객체에 데이터를 추가하거나 변경할 수 있음
컬렉션불변형(읽기전용)가변형
ListlistOfmutableListOf, arrayListOf
SetsetOfmutableSetOf, hashSetOf, linkedSetOf, sortedSetOf
MapmapOfmutableMapOf, hashMapOf, linkedMapOf, sortedMapOf

✏️1. List 활용하기✏️

List란? 순서에 따라 정렬된 요소를 가지는 컬렉션

1-1. 불변형 List

📌 listOf 함수

  • public fun <T> listOf(vararg elements: T): List<T>
  • vararg는 가변 인자를 받을 수 있기 때문에 원하는 만큼 요소를 지정할 수 있음
  • 형식 매개변수 <T>는 자료형을 지정하지 않으면 <Any>가 기본값

📌 컬렉션 반복하기

  • 인덱스를 통해 List에 접근하려면 컬렉션에 .indices멤버를 추가하면 됨
fun main() {
    val fruits = listOf("apple", "banana", "kiwi")
    for(item in fruits)
        println(item)
    
    // 인덱스를 통한 접근
    for(index in fruits.indices)
        println("fruits[$index] = ${fruits[index]}")
}

📌 emptyList() 함수

  • val emptyList: List<String> = emptyList<String>()
  • 비어 있는 List를 생성
  • 반드시 형식 매개변수를 지정해주어야 함

📌 listOfNotNull() 함수

  • null을 제외한 요소만 반환해 List를 구성
val nonNullsList: List<Int> = listOfNotNull(2, 45, 2, null, 5, null)
// nonNUllsList = [2, 45, 2, 5] 로 생성

1-2. 가변형 List

📌 arrayListOf() 함수

  • public fun <T> arrayListOf(vararg element: T): ArrayList<T>
  • 요소를 추가하거나 삭제할 수 있는 List
  • add()remove() 를 통해 요소를 추가하거나 삭제
  • 컴파일할 때 반환되는 자료형은 List가 아닌 자바의 ArrayList

📌 가변형 mutableListOf() 함수

  • public fun <T> mutableListOf(vararg elements: T): MutableList<T>
  • MutableList를 반환
  • add()removeAt() 메서드를 통해 요소를 추가, 삭제
  • 기존 불변형 List를 toMutableList()를 사용하여 가변형으로 변경 가능
    -> 기존의 List는 그대로 두고 새로운 공간을 생성
fun main() {
    val fruits = listOf("apple", "banana", "kiwi") // 불변형 List
    val mutableFruits = fruits.toMutableList() // 새로운 가변형 List 생성
    mutableFruits.add("grape") // 가변형 List에 요소 추가
}

📌 List와 배열의 차이

  • Array<T>
    • Array클래스에 의해 생성되는 배열 객체는 고정된 크기의 메모리를 가짐
    • Array<T>MutableList<T>는 제네릭 관점에서 상·하위 자료형 관계가 성립하지 않는 무변성
      -> Array<Int>Array<Number>는 무관
  • List<T>
    • 메모리 크기가 고정된 것이 아니기 때문에 자료구조에 따라 늘리거나 줄이는 것이 가능
    • List<T>MutableList<T>는 인터페이스로 설계되어 하위에서 특정한 자료구조로 구현함. 따라서 해당 자료구조에 따라 성능이 달라짐
    • List<T>는 공변성
      -> 하위인 List<Int>List<Number>에 지정될 수 있음

✏️2. Set과 Map 활용하기✏️

Set 이란? 정해진 순서가 없는 요소들의 집합
중복된 요소를 가질 수 없음 -> 모든 요소가 유일(unique)해야 함
Map 이란? 요소를 키와 값의 쌍 형태로 저장
키는 중복될 수 없고 유일하지만, 값은 중복해서 사용 가능


2-1. Set의 활용

📌 불변형 setOf() 함수

  • 불변형 Set<T>를 반환
  • 자료형을 혼합하거나 특정 자료형을 지정 가능
  • 중복 요소를 허용하지 않음
fun main() {
    val mixedTypeSet = setOf("Hello", 5, "world", 4.14, 'c') // 자료형 혼합 초기화
    // mixedTypeSet = [Hello, 5, world, 4.14, c]
    
    var intSet: Set<Int> = setOf<Int>(1, 5, 5)
    // intSet = [1, 5] -> 중복 허용X
}

📌 가변형 mutableSetOf() 함수

  • 요소의 추가 및 삭제가 가능한 집합을 만들 수 있음
  • MutableSet 인터페이스 자료형을 반환
  • 내부적으로 자바의 LinkedHashSet을 만들어냄
fun main() {
    val animals = mutableSetOf("Lion", "Dog", "Cat", "Python", "Hippo")
    
    animals.add("Lion") // 이미 존재하는 요소이므로 변화 없음
    animals.remove("Python") // Python 삭제
}

2-2. Set의 여러가지 자료구조

📌 hashSetOf() 함수

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

📌 sortedSetOf() 함수

  • TreeSet 컬렉션을 정렬된 상태로 반환
  • 레드 블랙 트리(RB tree: Red-Black tree) 알고리즘을 사용해 자료구조를 구성
    • 요소를 빨간색과 검은색으로 구분해 치우친 결과 없이 트리의 요소를 배치하여 최악으로 요소 배치가 되어도 검색 등의 처리에서 일정한 시간을 보장
  • HashSet보다 성능이 떨어지고 데이터를 추가하거나 삭제하는데 시간이 걸리지만 검색과 정렬이 뛰어남

📌 linkedSetOf() 함수

  • 자바의 LinkedHashSet 자료형을 반환
  • Linked list 를 사용해 구현된 해시 테이블에 요소를 저장
    • 자료의 추가 삭제는 O(1)의 시간에 가능
    • 단순 검색은 O(n)의 시간이 걸리는 단점이 있음
  • 저장된 순서에 따라 값이 정렬
  • HashSet, TreeSet보다 느림
  • 다음 데이터를 가리키는 포인터 연결을 통해 메모리 저장공간을 효율적으로 사용

2-3. Map의 활용

  • 키(Key)와 값(Value)으로 구성된 요소를 저장
    • 키와 값은 모두 객체
  • 키는 중복될 수 없지만 값은 중복 저장 가능
  • 기존 저장한 키로 값을 저장하면 기존의 값은 새로운 값으로 대체

📌 불변형 mapOf() 함수

  • val map: Map<키 자료형, 값 자료형> = mapOf(키 to 값[...])
fun main() {
    val langMap: Map<Int, String> = mapOf(11 to "Java", 22 to "Kotlin", 33 to "C++")
    
    // 여기서 22는 인덱스가 아닌 키값
    println("langMap[22] = ${langMap[22]}")
}

📌 가변형 mutableMapOf() 함수

  • 추가, 삭제가 가능한 가변형 Map을 정의
  • MutableMap(K, V) 인터페이스 자료형을 반환
  • put(키, 값) 형태로 요소를 추가
  • remove(키) 형태로 요소를 삭제
fun main() {
    val capitalCityMap: MutableMap<String, String> = mutableMapOf("Korea" to "Seoul", "China" to "Beijing")
    capitalCityMap.put("UK", "London")
    // capitalCityMap["UK"] = "London" 처럼 사용 가능
    
    capitalCityMap.remove("China") // 키값으로 제거
    
    val addData = mutableListOf("USA" to "Washington")
    
    // putAll() 메서드를 사용하여 capitalCityMap에 addData를 병합
    capitalCityMap.putAll(addData)
}
profile
장똑대와 안드로이드

0개의 댓글

관련 채용 정보