타이탄의 도구들

[Kotlin] Collection, Mutable, Immutable 본문

Dev Tools/Kotlin

[Kotlin] Collection, Mutable, Immutable

Titan04 2022. 6. 9. 09:29
728x90

Collection(콜렉션)은 대부분의 프로그래밍 언어에 있는 자료구조이며

데이터들을 한 곳에 모아 관리와 사용을 편하게 하기 위해 제공하는

프레임워크입니다.

코틀린의 List, Map, Set 등이 Collection에 해당합니다.

Collection은 제네릭으로 구현이 되어 다양한 타입과 함께 사용될 수 있습니다.

(ex Map<Key, T>, List<T>...)

개인적으로 이 개념에 대해 정리하게 된 계기는 안드로이드 개발에서

LiveData를 활용할 때, 왜 LiveData와 MutableLiveData를 구분하는지

의문에서부터 시작되었습니다.

코틀린의 Collection은 기본적으로

Mutable(변할 수 없는)과 Immutable(불변의)을 별개로 지원합니다.

Mutable로 생성하면 추가, 삭제가 가능하지만,

Immutable로 생성하면 수정이 안됩니다.

하지만, Mutable 컬렉션이 변할 수 있다고 해서

반드시 변수로 var 를 사용해야 하는것은 아닙니다.

val numbers = mutableListOf("one", "two", "three", "four")
numbers.add("five")   //변경 가능
println(numbers)
//numbers = mutableListOf("six", "seven")      // 컴파일 에러 발생

위 코드에서 add 작업은 이미 메모리가 할당된 numbers라는

Mutable 컬렉션 객체를 수정하므로

메모리의 참조가 변경되지 않고 val 변수일지라도 컴파일에 문제가 없습니다.

다만, numbers를 주석과 같이 재할당하려고 하면 메모리의 참조가 변경되므로

val 컴파일 오류가 발생합니다.

코틀린의 Collection은 아래 그림과 같은 상속 구조 갖고 있습니다.

[부모 → 자식]

 

그렇다면 왜 직접 해당 클래스에서 값을 변경하지 않고,

이렇게 mutable한 클래스를 따로 만들어서 값을 변경하게 했을까요?

바로 불변성(Immutability)이 중요한 함수형 프로그래밍을 돕기 위해서

보여집니다.

Kotlin은 불변성이 강제되는 순수 함수형 프로그래밍 언어가 아닌 함수형+객체지향형 프로그래밍 언어이므로

불변성을 '권장'하는 의미에서 불변을 기본으로 해서 변할수 있는(Mutable) 클래스를 제공하게 된 것입니다.

<참고 링크>

[collections 소개]

https://kotlinlang.org/docs/collections-overview.html#map

https://codechacha.com/ko/collections-in-kotlin/

[코틀린과 불변성]

https://readystory.tistory.com/105

[LiveData란?]

https://www.charlezz.com/?p=363

728x90
Comments