코틀린의 컬렉션 설계 철학은 "안전제일주의"입니다. 자바와 다르게 컬렉션을 만들 때부터 불변(Read-only)과 가변(Mutable)을 엄격하게 분리하여 강제합니다.
기본 함수인 listOf(), setOf(), mapOf()로 만든 컬렉션은 읽기만 가능하며 절대 값을 추가하거나 삭제할 수 없습니다. 내용물을 변경해야 한다면 반드시 이름 앞에 mutable이 붙은 mutableListOf() 등을 사용해야 합니다.
💡 핵심 비유: 전시용 진열장과 작업용 선반
listOf()는 자물쇠로 잠겨 있는 유리 전시용 진열장입니다. 밖에서 구경(Read)만 할 수 있고, 물건을 빼거나 넣을 수 없습니다. (데이터 오염 방지) mutableListOf()는 물건을 자유롭게 넣고 뺄 수 있는 작업용 오픈 선반입니다.
🛡️ 불변(Immutable) vs 가변(Mutable) 컬렉션
📊 코틀린 컬렉션 함수 비교
자료구조
불변 (Read-only)
가변 (Mutable)
List (순서O, 중복O)
listOf()
mutableListOf()
Set (순서X, 중복X)
setOf()
mutableSetOf()
Map (Key-Value)
mapOf(A to B)
mutableMapOf(A to B)
fun main() {
// 1. List (순서 보장, 중복 허용)
// 읽기 전용(Immutable) 리스트
val readOnlyList = listOf("Apple", "Banana", "Cherry")
println("읽기 전용: " + readOnlyList)
// readOnlyList.add("Orange")
// 컴파일 에러! listOf로 만들면 add(), remove() 같은 메서드 자체가 존재하지 않습니다.
// 가변(Mutable) 리스트
val mutableList = mutableListOf("Apple", "Banana")
mutableList.add("Cherry") // 추가 가능!
println("수정 가능: " + mutableList)
// 2. Map (Key-Value 쌍)
// 'to' 라는 특별한 키워드(중위 연산자)를 사용하여 매우 직관적으로 키-값 쌍을 연결합니다.
val menuPrices = mutableMapOf(
"아메리카노" to 4000,
"카페라떼" to 4500
)
// 값을 추가하거나 읽을 때 자바의 put(), get() 대신
// 마치 배열을 다루듯 대괄호[]를 사용할 수 있습니다.
menuPrices["바닐라라떼"] = 5000 // 값 추가
println("아메리카노 가격: " + menuPrices["아메리카노"]) // 값 읽기
}