[내배캠 - 오늘의 문제]
https://school.programmers.co.kr/learn/courses/30/lessons/92334
map에서 값을 추가할 때, key값이 존재하는지 체크하고
없다면 init / 있으면 값을 추가하는 로직(if-else 또는 if)을 많이 짰었는데
좋은 메서드를 발견해서 리뷰와 getOrPut() 메서드의 간단한 분석을 해볼까 한다.
val reportUser = mutableMapOf<String, MutableSet<String>>()
// 키가 있는지 체크하고 없으면 init 셋업 해주고 그 뒤 add 하는 코드
reportUser.getOrPut(toID) { mutableSetOf() }.add(fromID)
// if
if (!reportUser.containsKey(toID)) {
reportUser[toID] = mutableSetOf()
}
reportUser[toID]?.add(fromID)
// if-else
if (!reportUser.containsKey(toID)) {
reportUser[toID] = mutableSetOf(fromID)
} else {
reportUser[toID]?.add(fromID)
}
어떻게 같은 로직으로 돌아가는지 getOrPut() 메서드를 분석해보자.
val reportUser = mutableMapOf<String, MutableSet<String>>()
reportUser.getOrPut(toID) { mutableSetOf() }.add(fromID) // Function call
public inline fun <K, V> MutableMap<K, V>.getOrPut(key: K, defaultValue: () -> V): V {
val value = get(key)
return if (value == null) {
val answer = defaultValue()
put(key, answer)
answer
} else {
value
}
}
우선 MutableMap의 확장함수 인걸 볼 수 있다.
파라미터 - key : toID / defalutValue : { mutableSetOf() }
바디
1. 전달 받은 key값인 toID를 통해서 value에 접근한다.
2. if문 : 존재하지 않는 key인 경우, answer는 전달 받은 mutableSetOf()가 된다.
put -> key와 value값을 넣어준다 -> map[toID] = mutableSetOf()
그런 뒤, answer( mutableSetOf() )반환
else문 : 존재하는 key인 경우 value인 MutableSet 타입의 집합을 반환한다.
이때의 반환 타입은 if-else 모두 value 타입으로 지정된다. 위 예제에서는 MutableSet<String>타입
그렇기 때문에 바로 .add()로 접근해서 값을 추가할 수 있었다!
'CT With Kotlin' 카테고리의 다른 글
[Level 1] 햄버거 만들기 Stack vs MutableList, 시간 비교(요소 삽입, 제거 및 인덱스접근) (3) | 2024.03.23 |
---|---|
[Level 1] 숫자 짝꿍 - IntArray vs MutableList, 시간 측정 및 단축 (0) | 2024.03.18 |
[Level 1] 기사단원의 무기 - 전처리 (0) | 2024.03.14 |
[Level 1] 소수 만들기 - combination(조합) (0) | 2024.03.12 |
[Level 1] 명예의 전당 (1) - PriorityQueue (0) | 2024.03.07 |