오늘은 알고리즘 문제를 풀다보니 컬렉션을 다룰 일이 많은데 아는 함수가 많지 않아서 어려움이 조금 있었다. 물론 함수를 사용하지 않고도 해결할 수 있긴 하지만 코틀린에서 제공하는 함수들을 이용하면 간단하게 해결가능한 경우가 많다는 것을 알게 되었다. 앞으로도 매우 유용하게 사용할 수 있을 것 같아 그 내용을 정리해보았다.
1. Kotlin 컬렉션에서 사용하는 함수들
1-1. get(), getOrNull(), getOrElse()
순서가 있는 리스트와 배열에서는 get()을 이용하여 인덱스에 해당하는 값을 불러올 수 있다. 맵에서는 get()에 인자로 키를 넣어주면 키에 해당하는 값을 반환받을 수 있다. 하지만 이런 방식은 거의 사용하지 않고 대괄호를 이용하여 편리하게 값을 가져오는 편이다.
맵에서는 대괄호와 get()을 이용하게되면 반환타입이 null을 허용하는 키 값의 타입이 된다. 키 값에 해당하는 값이 없으면 예외가 발생하지 않고, null이 반환된다.
그렇지만 리스트와 배열에서는 인덱스가 범위를 벗어나게 되면 IndexOutOfBoundsException 예외가 발생하게 된다. 만약 예외를 발생시키고 싶지 않을때는 getOrNull()을 이용할 수 있다. 해당 인덱스의 값이 존재하지 않으면 null을 반환한다.
코드를 작성해서 확인해 볼 수 있다.
fun main() {
val arr = intArrayOf(1,2,3,4,5)
val list = listOf(1,2,3,4,5,6,7)
println(arr.getOrNull(30)) // null
println(list.getOrNull(30)) // null
}
위와 같이 예외가 발생하는 대신 null값을 반환받을 수 있다. 때문에 반환되는 값의 타입도 null을 허용하는 타입이 되니 주의해야 한다.
getOrElse() 함수를 사용하면 인자로 넣어준 인덱스 혹은 키 값에 해당하는 값이 존재하지 않을 경우 null 값 대신 내가 원하는 값을 반환받을 수 있다. 반환 받을 값을 람다식 안에 넣어주면 된다.
직접 코드로 작성해서 확인해보면 이해가 쉽다.
fun main() {
val arr = intArrayOf(1,2,3,4,5)
val list = listOf(1,2,3,4,5,6,7)
val map:MutableMap<String,Int> = mutableMapOf("A" to 1, "B" to 2, "C" to 3)
println(arr.getOrElse(3) {100}) // 4
println(arr.getOrElse(20) {100}) // 100
println(arr.getOrElse(10) {it}) // 10
println(list.getOrElse(4) { 100 }) // 5
println(list.getOrElse(20) { 100 }) // 100
println(list.getOrElse(30) {it*it}) // 900
println(map.getOrElse("B") {4}) // 2
println(map.getOrElse("D") {4}) // 4
}
1-2. getOrDefault(), getOrPut()
getOrDefault()와 getOrPut()은 맵에 사용 가능한 함수들이다.
getOrDefault()는 getOrElse()랑 거의 똑같다. 대신 getOrDefault()에서는 키에 해당하는 값이 존재하지 않을때 반환받을 값을 그냥 써주기만 하면 된다.
getOrPut()은 키에 해당하는 값이 존재하지 않는다면 값을 넣어주는 것까지 수행해준다.
코드로 확인해보면 이해하기 쉽다.
fun main() {
val map:MutableMap<String,Int> = mutableMapOf("A" to 1, "B" to 2, "C" to 3)
println(map.getOrDefault("D", 0)) // 0
println(map.getOrPut("A") {4}) // 1
println(map.getOrPut("D") {4}) // 4
println(map.getOrDefault("D", 0)) // 4
}
getOrDefault()는 어떤 컬렉션안의 요소들의 갯수를 셀 때 요긴하게 사용할 수 있다.
아래 코드처럼 사용해 볼 수 있다.
fun main() {
val list = listOf("사과", "배", "수박", "메론", "사과", "배", "수박", "사과",
"배", "수박", "사과", "수박", "메론", "사과", "배", "수박", "메론")
val map:MutableMap<String,Int> = mutableMapOf()
for (item in list) {
map[item] = map.getOrDefault(item, 0) + 1
}
println(map) // {사과=5, 배=4, 수박=5, 메론=3}
}
getOrPut()은 어떤 컬렉션을 특정 기준으로 묶을 때 요긴하게 사용할 수 있다.
fun main() {
val list = listOf("사과", "배", "참외", "메론", "망고", "귤", "오렌지", "블루베리", "천도복숭아", "바나나")
val map:MutableMap<Int,MutableList<String>> = mutableMapOf()
for (fruit in list) {
val length = fruit.length
map.getOrPut(length) { mutableListOf() }
map[length]!!.add(fruit)
}
// 문자열 길이 순으로 묶을 수 있다.
println(map)
// {2=[사과, 참외, 메론, 망고], 1=[배, 귤], 3=[오렌지, 바나나], 4=[블루베리], 5=[천도복숭아]}
}
2. 오늘 배운 것
- 오늘 과제 해설 세션이 있었는데 모르는 부분들이 많았다. 앞으로 더 열심히 공부해봐야겠다.
- 알고리즘 공부를 하다보니 알아야 할 게 정말 많다는 걸 느끼게 되었다. 하나하나 차근차근 해봐야겠다.
'오늘 배운 것' 카테고리의 다른 글
24-05-05 Kotlin 구조 분해 선언 (0) | 2024.05.05 |
---|---|
24-05-04 Kotlin 컬렉션 최대값과 최솟값 (0) | 2024.05.04 |
24-05-02 Kotlin split(), 스코프 함수 also (0) | 2024.05.02 |
24-05-01 Kotlin 객체(인스턴스)가 생성, 저장, 호출되는 방식 (0) | 2024.05.01 |
24-04-30 Kotlin 숫자 야구 게임 만들기 (2) (0) | 2024.04.30 |