[HeadFirst] Kotlin collections :: List

probehub·2021년 10월 31일
0

코틀린

목록 보기
12/20

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칸식 옮겨가야 한다는 것을 의미한다. 이러한 작업을 많이 하다보면 프로그램 성능을 저하시킬 수도 있겠다 싶다.

profile
개발자

0개의 댓글

관련 채용 정보