Immutable

  • kotlin 은 함수형 패러다임을 반영한다.

  • 함수형 프로그래밍에서는 불변(immutable)값을 사용해 사이드이펙트를 제거한다.

  • 원본 리스트를 수정하지 않고, 수정된 새로운 리스트를 생성해 반환한다.

  • 함수적 자료구조에서 리스트를 수정하는 작업은, 기존 리스트는 유지하고 조작되는 부분만 새로 생성하기 때문에 오버헤드가 없다.

val immutableList: List<Int> = listOf(1,2,3,4,5)

immutableList.add(6) // Error, 애초에 add() 가 존재하지 않는다.

for (i in 0 until immutableList.size) {
    println(immutableList.get(i)) // 1,2,3,4,5
}

val immutableList: List<Int> = listOf(1,2,3,4,5)

val newList = immutableList.plus(6) // OK
                                    // 기존의 immutableList 에(자신에) 값이 추가되는 것이 아닌,
                                    // 6 이란 값이 추가된(변경된) 새로운 리스트를 생성한다.

for (i in 0 until immutableList.size) {
    println(immutableList.get(i)) // 1,2,3,4,5
}

for (i in 0 until newList.size) {
    println(newList.get(i)) // 1,2,3,4,5,6                                    
}

  • plus() 처럼 값을 변경할 때마다 새로운 리스트를 생성한다면 오버헤드가 클 수 있다고 생각할 수 있으나 함수적 자료구조 중 List 는 내부적으로 LinkedList 로 되어있고, 위의 경우 6을 추가했을때 완전히 새로운 리스트를 반환하는 것이 아니라, 기존의 List 에 6 만 추가한 것을 리턴하는 것이기 때문에 오버헤드는 그리 크지 않다.

Last updated