밤빵's 개발일지
[TIL]20241103 Immutable Collection & Mutable Collection 본문
코틀린의 불변 컬렉션(Immutable Collection)과 가변 컬렉션(Mutable Collection)은 자바에서 이미 List, Set, Map과 같은 컬렉션을 사용해봤지만, 이들 컬렉션을 불변성과 가변성으로 구분하여 제공한다는 점이 다르다. 이 두 가지 컬렉션의 차이점을 이해하고, 각각의 사용법과 특징을 익히는 것은 코틀린에서 안전한 코드를 작성하는 데 중요한 역할을 한다.
▶불변 컬렉션(Immutable Collection) 과 가변 컬렉션(Mutable Collection)의 개념
코틀린에서는 컬렉션을 생성할 때 기본적으로 불변(Immutable) 컬렉션과 가변(Mutable) 컬렉션 중 하나로 선택할 수 있다. 불변 컬렉션은 한 번 생성되면 내부의 요소를 변경할 수 없고, 가변 컬렉션은 생성 후에도 요소를 추가하거나 삭제할 수 있다.
불변 컬렉션(Immutable Collection)
컬렉션을 생성한 후에는 요소를 추가, 제거, 변경할 수 없다. 불변 컬렉션은 읽기 전용으로 제공되며, 코드의 안전성과 가독성을 높인다.
가변 컬렉션(Mutable Collection)
컬렉션 생성 후에도 요소의 추가, 삭제, 변경이 가능하다. 코틀린의 가변 컬렉션은 Mutable 키워드가 붙어 있으며, 필요할 때 요소를 조작할 수 있다.
→ 코틀린에서 불변 컬렉션은 listOf, setOf, mapOf로 생성하고, 가변 컬렉션은 mutableListOf, mutableSetOf, mutableMapOf로 생성한다.
▶코틀린의 불변 컬렉션과 가변 컬렉션 사용법
코틀린에서는 List, Set, Map을 불변 또는 가변으로 선언할 수 있다.
List
→ 불변 리스트 (List): 요소를 추가하거나 변경할 수 없다.
val immutableList = listOf("Apple", "Banana", "Cherry")
// immutableList.add("Orange") // 오류 발생: 불변 리스트는 요소 추가 불가
→ 가변 리스트 (List): 요소를 자유롭게 추가하거나 변경할 수 있다.
val mutableList = mutableListOf("Apple", "Banana", "Cherry")
mutableList.add("Orange") // 요소 추가 가능
println(mutableList) // 출력: [Apple, Banana, Cherry, Orange]
Set
→ 불변 집합 (Set): 중복을 허용하지 않고, 요소의 추가나 변경이 불가하다.
val immutableSet = setOf("A", "B", "C")
// immutableSet.add("D") // 오류 발생: 불변 집합은 요소 추가 불가
→ 가변 집합 (Set): 중복을 허용하지 않으며, 요소를 추가, 제거할 수 있다.
val mutableSet = mutableSetOf("A", "B", "C")
mutableSet.add("D")
println(mutableSet) // 출력: [A, B, C, D]
Map
→ 불변 맵 (Map): 키-값 쌍을 추가하거나 변경할 수 없다.
val immutableMap = mapOf("Key1" to "Value1", "Key2" to "Value2")
// immutableMap["Key3"] = "Value3" // 오류 발생: 불변 맵은 요소 추가 불가
→ 가변 맵 (Map): 키-값 쌍을 추가, 변경할 수 있다.
val mutableMap = mutableMapOf("Key1" to "Value1", "Key2" to "Value2")
mutableMap["Key3"] = "Value3"
println(mutableMap) // 출력: {Key1=Value1, Key2=Value2, Key3=Value3}
▶자바와 코틀린의 차이점
자바에서도 불변 컬렉션을 만들 수 있지만, 이를 위해 별도의 방법을 사용해야 한다. 예를 들어 Collections.unmodifiableList 또는 List.of를 사용하여 불변 리스트를 생성할 수 있다. 그러나 자바의 컬렉션은 기본적으로 가변성이며, 불변 컬렉션을 생성하는 절차가 다소 번거롭다. 코틀린에서는 불변 컬렉션이 기본으로 제공되며, listOf, setOf, mapOf와 같이 간단하게 불변 컬렉션을 생성할 수 있다. 반면, 가변 컬렉션을 명시적으로 사용하려면 mutableListOf, mutableSetOf, mutableMapOf를 사용해야 한다. 코틀린에서는 불변 컬렉션을 기본으로 하는 것이 권장되며, 필요할 때만 가변 컬렉션을 사용하는 방식으로 코드를 작성하게 된다.
▶자바와 코틀린의 불변 컬렉션 차이점 요약
항목 | 자바 | 코틀린 |
기본 컬렉션 | 가변 컬렉션 | 불변 컬렉션 |
불변 컬렉션 생성 | Collections.unmodifiableList() 또는 List.of() | listOf(), setOf(), mapOf() |
가변 컬렉션 생성 | ArrayList, HashSet, HashMap | mutableListOf(), mutableSetOf(), mutableMapOf() |
불변 컬렉션 권장 | 특별히 권장되지 않음 | 권장됨 |
▶불변 컬렉션과 가변 컬렉션의 장단점
불변 컬렉션의 장점
→ 안전성: 컬렉션의 상태가 변하지 않아 예측 가능한 코드를 작성할 수 있다.
→ 가독성: 불변 컬렉션을 사용하면 데이터가 변경되지 않음을 명시할 수 있어 코드의 의도를 명확히 전달할 수 있다.
→ 동시성: 멀티스레드 환경에서 데이터의 일관성을 보장할 수 있다.
가변 컬렉션의 장점
→ 유연성: 필요에 따라 컬렉션의 데이터를 추가, 삭제할 수 있어 다양한 상황에 유연하게 대응할 수 있다.
→ 사용 용이성: 특정한 경우에는 가변 컬렉션이 더 직관적이며, 요소를 동적으로 관리할 때 편리하다.
▶활용 예시
→ 불변 컬렉션을 활용한 설정 값 관리
설정 값처럼 변경될 필요가 없는 데이터는 불변 컬렉션으로 선언하여 데이터의 안정성을 보장할 수 있다.
val defaultSettings = mapOf(
"theme" to "dark",
"fontSize" to "medium"
)
→ 가변 컬렉션을 활용한 데이터 추가
사용자 입력을 기반으로 데이터를 동적으로 관리해야 할 때는 가변 컬렉션을 사용할 수 있다.
val userList = mutableListOf("Alice", "Bob")
userList.add("Charlie")
println(userList) // 출력: [Alice, Bob, Charlie]
코틀린에서 제공하는 불변 컬렉션과 가변 컬렉션은 데이터의 변경 여부에 따라 컬렉션을 적절히 선택하여 사용할 수 있게 해준다. 불변 컬렉션은 안전하고 예측 가능한 코드를 작성할 수 있게 해주고, 가변 컬렉션은 유연성을 제공하여 다양한 상황에 대응할 수 있도록 한다. 코틀린과 자바의 차이점 중 하나는 불변 컬렉션이 기본으로 제공된다는 점이다. 자바에서는 기본적으로 가변 컬렉션을 사용하고 불변 컬렉션을 명시적으로 설정해야 하지만, 코틀린에서는 불변 컬렉션이 기본이므로 코드의 안정성이 높아지는 장점이 있다.
'Kotlin' 카테고리의 다른 글
[TIL]20241105 Label & break/continue (1) | 2024.11.05 |
---|---|
[TIL]20241104 Named Argument (1) | 2024.11.04 |
[TIL]20241102 백틱(`) 활용 (0) | 2024.11.02 |
[TIL]20241101 타입 시스템 (0) | 2024.11.01 |
[TIL]20241031 Operator Overloading (4) | 2024.10.31 |