가변(Mutable) 컬렉션 : 컬렉션에 element를 추가, 삭제할 수 있다.
불변 컬렉션: 컬렉션에 element를 추가, 삭제할 수 없다. 기존에 존재하는 field 값은 변경 가능하다.
fun main() {
// array 생성 방법
val array = arrayOf(100, 200)
// 배열에 인덱스로 접근하는 방법
for (i in array.indices){
println("${i} ${array[i]}")
}
// 배열에 인덱스와 값에 한번에 접근하는 방법
for ((idx, value) in array.withIndex()) {
println("$idx $value")
}
}
val numbers = listOf<Int>(100, 200)
val empty = emptyList<Int>()
// 가변 : Mutable
// 가변(Mutable) 리스트를 만들고 싶다면?!!
// val Mutable_numbers = mutableListOf(100, 200)
// numbers.add(300)
// 집합 선언 방법 val numbers = setOf(100, 200)
// 가변 집합 val numbers = mutableSetOf(100, 200)
// 추론 가능하기에 에러 x
printNumbers(emptyList())
println(numbers[0])
for(number in numbers){
println(number)
}
for ((idx, value) in numbers.withIndex()) {
println("${idx} ${value}")
}
fun main(){
val oldMap = mutableMapOf<Int, String>()
oldMap[1] = "MONDAY"
oldMap[2] = "TUESDAY"
// 불변맵 초기화 방법
// mapOf(1 to "MONDAY", 2 to "TUESDAY")
for (key in oldMap.keys) {
println(key)
println(oldMap[key])
}
for ((key, vlaue) in oldMap.entries){
}
}
리스트 사용시 주의할 점
List<Int?> : 리스트에 null이 들어갈 수 있지만, 리스트는 절대 null이 아님
List? : 리스트에는 null이 들어갈 수 없지만, 리스트는 null일 수 있음
List<Int?>? : 리스트에 null이 들어갈 수도 있고, 리스트가 null일 수도 있음
예제를 통한 설명
class Fruit (val name: String, val price: Int)
fun main() {
val fruits = listOf(
Fruit("사과", 1_000),
Fruit("사과", 1_200),
Fruit("사과", 1_200),
Fruit("사과", 1_500),
Fruit("바나나", 3_000),
Fruit("바나나", 3_200),
Fruit("바나나", 2_500),
Fruit("수박", 10_000),
)
// 람다란 익명 함수
// 함수의 타입: (파라미터 타입...) -> 반환 타입
val isApple: (Fruit) -> Boolean = fun(fruit: Fruit): Boolean {
return fruit.name == "사과"
}
val isApple2: (Fruit) -> Boolean = {fruit: Fruit -> fruit.name == "사과"}
// 람다를 직접 호출하는 방법 1
println(isApple(fruits[0]))
// 람다를 직접 호출하는 방법 2
println(isApple.invoke(fruits[0]))
// 마지막 파라미터가 함수인 경우, 소괄호 밖에 람다 사용 가능하다.(추천)
println(filterFruits(fruits) {fruit -> fruit.name == "사과"})
// 파라미터가 하나일 경우 아래와 같이 it을 사용할 수 있다.(비추)
println(filterFruits(fruits) {it.name == "사과"})
// tip : 람다를 여러줄 작성할 수 있고, 마지막 줄의 결과가 람다의 반환값이다.
}
// 코틀린에서는 함수를 파라미터로 받을 수 있다.
// filter: (Fruit) -> Boolean 의미는 Fruit를 파라미터로 밭고 Boolean 타입을 리턴하는 함수를 변수로 받겠다고 명시한 것이다.
private fun filterFruits(
fruits: List<Fruit>, filter: (Fruit) -> Boolean
): List<Fruit>{
val results = mutableListOf<Fruit>()
for (fruit in fruits) {
if (filter(fruit)) {
results.add(fruit)
}
}
return results
}