[HeadFirst] Kotlin collections :: List

Array는 굉장히 유용했다. 하지만 Kotlin 에서 Array 는 초기화되는 순간 그 사이즈가 고정이 되어 버린다. 그리고 Array 를 val 로 선언한다 하더라도 그 내부 원소가 업데이트 되는것을 막을 수는 없다. collection 은 이러한 Array 의 단점을 극복하고, 개발자가 더 유연하게 객체들을 저장하고 관리할 수 있도록 돕는 수단이다. 여러 블로그나 stackoverflow 를 돌아다니기 보다는 정리된 자료를 보고 싶다면 Kotlin Standard Library 에서 확인해보는걸 추천한다.

List, Set, Map

Collection 에는 deque 등 다양한 자료구조를 지원하지만, 대표적으로 사용되는 자료구조는 List, Set, Map 이다. Kotlin 에서 기본적으로 제공하는 자료구조는 immutable 로 Array 와 같이 데이터 추가, 제거가 불가능하다. 대신 Mutable 인터페이스를 구현하는 MutableList, MutableSet, MutableMap 클래스를 지원한다.

List

List 는 순서가 있는 자료를 저장하는데 적합한 구조이다. Array 와 비슷한 부분이 많다.
아래는 immutableList 의 생성과 for 문 사용, contains 사용 예가 나와있다.

fun main() {
    val shopping = listOf("Tea", "Eggs", "Milk")
//    val shopping: List<String> = listOf("Tea", "Eggs", "Milk")
    for (item in shopping) println(item)
    
    if (shopping.contains("Milk")) {
        println(shopping.indexOf("Milk"))
    }
}

MutableList

fun main() {
    val shopping = mutableListOf("Tea", "Eggs", "Milk")
    shopping.add("Sugar")
    shopping.add(1, "Salt")
    
    if (shopping.contains("Milk")) {
        shopping.remove("Milk")
    }
    
    if (shopping.size > 1) {
        shopping.removeAt(1)
    }
    
    shopping.set(0, "Fish")
    
    shopping.sort() // sort by natural order
    shopping.reverse()
    shopping.shuffle() // randomize oreder
    
    
    val toAdd = listOf("Cookie", "Bread")
    shopping.addAll(toAdd)
    
    val toRemove = listOf("Sugar")
    shopping.removeAll(toRemove)
    
    val toRetain = listOf("Tea", "Eggs", "Salt")
    shopping.retainAll(toRetain) // 주어진 list 의 원소를 제외한 나머지는 모두 remove
    
    // 이하의 함수들은 immutable list 를 반환한다. 이름만 봐도 어떤걸 반환하는지 알 수 있다.
    val shoppingCopy = shopping.toList()
    val shoppingSort = shopping.toSorted()
    val shoppingReverse = shopping.toReversed()
    val shoppingSuffle = shopping.toShuffled()
    
    // Mutable 의 copy 는 바로 sort, reverse, shuffle 해주는 함수는 없다. 몇단계 거쳐서 적용해야한다.
    val shoppingRealCopy = shopping.toMutableList()
}

List 중간에 새로운 원소를 추가한다는 것은 뒤에 있는 원소들이 모두 1칸식 옮겨가야 한다는 것을 의미한다. 이러한 작업을 많이 하다보면 프로그램 성능을 저하시킬 수도 있겠다 싶다.

좋은 웹페이지 즐겨찾기