val array = arrayOf(100, 200)
for (i in array.indices) { } // 인덱스만
for ((idx, value) in array.withIndex()) { } // 인덱스와 값 모두
MutableList<Type> // 가변리스트
List<Type> // 불변리스트
가변 컬렉션과 불변 컬렉션이 존재한다. 불변컬렉션은 내부적으로 Collection 을 만들자마자 Collections.unmodifiableList()
등을 붙여준다.
불변 컬렉션은 정말 값 수정이 불가능한가?
정답은 No 다. 추가, 삭제가 불가능한 것이지 Reference Type 인 Element 의 필드는 바꿀 수 있다.
ex)
class Money (
val price
)
val moneyList: List<Money> = ...
moneyList.plus(money) // 불가
moneyList[0].price = 4000 // 가능
👏 TIP
가변 컬렉션 (Mutable) : 컬렉션에 element 추가, 삭제 가능
불변 컬렉션 : 가변 컬렉션의 반대
val numberList = listOf(...) // 리스트
val emptyList = emptyList<Type>() // 빈 리스트
val mutableList = mutableListOf(...) // 가변 리스트
값이 추론 가능하다면 emptyList 에 타입을 넣지 않아도 된다.
listOf()
는 기본적으로 불변이다.
가변 리스트를 사용하고싶다면 mutableListOf()
를 사용하면 된다.
numberList[0]
.get(0)
이 아닌 대괄호로 특정 인덱스의 값을 가져올 수 있다.
val numberSet = setOf(...)
val mutableNumberSet = mutableSetOf(...)
val map = mutableMapOf<KeyType, ValueType>()
map[0] = "MONDAY"
map[1] = "TUESDAY"
mapOf(1 to "MONDAY", 2 to "TUESDAY")
for (key in map.keys) { }
for ((key, value) in map.entires) { }
👏 TIP
List<Int?> : 리스트에 null 이 들어갈 수 있음, 리스트는 not null
List<Int>? : 리스트에 이 들어갈 수 없음, 리스트는 null 가능
List<Int?>? : 리스트에 null 이 들어갈 수 있음, 리스트도 null 가능
?
의 위치에 따라 의미가 달라지므로 차이를 잘 이해해야한다.
자바는 nullable 타입과 non-nullable 타입을 구분하지 않아 코틀린과 같이 쓸 때 주의하여야 한다.
코틀린에서 자바컬렉션을 가져다 사용할 때는 플랫폼 타입(= Type?
)을 신경써야한다. 자바코드를 보며 맥락을 확인하고 Wrapping 을 해야한다.