Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241103 Immutable Collection & Mutable Collection 본문

Kotlin

[TIL]20241103 Immutable Collection & Mutable Collection

최밤빵 2024. 11. 3. 22:02

코틀린의 불변 컬렉션(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