Lec 15. 코틀린에서 배열과 컬렉션을 다루는 방법
// 코틀린에서 배열을 만들고 순회하기
fun main() {
val array = arrayOf(100, 200)
for (i in array.indices) { // 인덱스만 받아오기
println("${i} ${array[i]}")
}
for ((idx, value) in array.withIndex()) { // 인덱스와 값을 함께 받아오기
println("${idx} ${value}")
}
array.plus(300) // 배열에 값을 쉽게 추가할 수 있다.
}
fun main() {
val numbers = listOf(100, 200) // 불변 리스트 생성
val emptyList = emptyList<Int>() // 빈 리스트 생성, 타입을 명시해야 한다.
printNumbers(emptyList()) // 타입이 추론 가능한 경우 타입 생략 가능
val mutableNumbers = mutableListOf(100, 200) // 가변 리스트 생성, 기본 구현체는 ArrayList
mutableNumbers.add(300)
}
private fun printNumbers(numbers: List<Int>) {
// ...
}
fun main() {
val numbers = listOf(100, 200)
println(numbers[0]) // [] 문법 사용 가능
for (number in numbers) { // for each
println(number)
}
for ((idx, value) in numbers.withIndex()) { // 전통적 for문 느낌
println("$idx $value")
}
}
List
와 비슷하다.fun main() {
val numbers = setOf(100, 200) // 불변 집합 생성
val mutableNumbers = mutableSetOf(100, 200) // 가변 집합 생성, 기본 구현체는 LinkedHashSet
for (number in numbers) { // for each
println(number)
}
for ((idx, value) in numbers.withIndex()) { // 전통적 for문 느낌
println("$idx $value")
}
}
Map
생성은 아래 코드와 같이 가능하다.fun main() {
val oldMap = mutableMapOf<Int, String>() // 가변 map 생성
oldMap[1] = "MONDAY"
oldMap[2] = "TUESDAY"
val immutableMap = mapOf(1 to "MONDAY", 2 to "TUESDAY") // 불변 map 생성
}
Map
접근은 아래 코드와 같이 가능하다.fun main() {
val oldMap = mutableMapOf<Int, String>()
oldMap[1] = "MONDAY"
oldMap[2] = "TUESDAY"
for (key in oldMap.keys) { // key만 순회
println(oldMap[key])
}
for ((key, value) in oldMap.entries) { // key, value 순회
println("$key $value")
}
}
List<Int?>
null
이 들어갈 수 있지만 리스트는 절대 null
이 아님List<Int>?
null
이 들어갈 수 없지만 리스트는 null
일 수 있음List<Int?>?
null
이 들어갈 수도 있고 리스트가 null
일 수도 있음?
위치에 따라 null 가능성 의미가 달라지므로 차이를 잘 이해해야 한다.null
을 추가할 수 없는 컬렉션을 만들어도 자바에서 이를 사용하는 경우 element를 추가할 수 있다.Collections.unmodifiableXXX()
를 활용하면 변경 자체를 막을 순 있다.List<Int>
을 코틀린으로 가져오면 List<Int?>,
List<Int>?,
List<Int?>?
인지 판단할 수 없다.