이번 포스팅에선 crossinline 소개와 사용하는 이유에 대해 알아보겠다.
비지역 반환(Non-Local Return)이란?
crossinline을 알아보기 전에 비지역 반환부터 알아보고 가자.
고차 함수에서 람다 표현식이나 익명 함수와 함께 사용될 때 발생하는 현상이다.
비지역 반환은 특정 블록이나 람다 표현식의 스코프를 벗어나 바깥쪽 함수나 스코프로 반환하는 것을 말한다.
Kotlin에서 일반 람다 내부에서 return 키워드를 사용하면, 람다가 아닌 람다를 포함하고 있는 함수까지 종료하게 된다.
fun foo() {
listOf(1, 2, 3).forEach {
if (it == 2) return // foo 함수를 종료하는 비지역 반환
println(it)
}
println("이 문장은 실행되지 않습니다.")
}
fun main() {
foo() // 출력: 1
}
비지역 반환(Non-Local Return)의 문제점
1. 예기치 않은 흐름 제어
비지역 반환을 사용하면 람다나 내부 함수에서 외부 함수까지 종료할 수 있으므로, 코드의 실행 흐름이 읽는 사람에게 예상치 못한 방식으로 변경될 수 있다. 이로 인해 코드를 이해하고 디버깅하기 어려워질 수 있다.
2. 유지보수 어려움
람다 또는 내부 함수에서 외부 함수까지 반환되는 비지역 반환은 코드의 연결성을 떨어뜨리고, 수정이나 확장이 필요할 때 어떤 부분이 영향을 받을지 파악하기 어려워질 수 있다.
3. 테스트의 어려움
특정 람다나 함수의 동작을 독립적으로 테스트하기가 어려워질 수 있다. 비지역 반환으로 인해 람다나 함수가 자체적으로 완결되지 않고 외부 스코프에 의존하게 되므로, 단위 테스트를 작성하기 복잡해질 수 있다.
4. 가독성 저하
코드의 가독성이 저하되어, 새로 코드를 읽는 개발자나 팀원들이 코드를 이해하기 어려울 수 있다. 비지역 반환의 동작이 직관적이지 않을 수 있으므로, 읽는 사람이 반환의 흐름을 정확히 파악하기 어렵게 만든다.
5. 코드의 안정성 감소
비지역 반환은 함수 간의 명확한 계약을 깨트릴 수 있으며, 이로 인해 코드의 안정성이 감소할 수 있다. 함수가 예상치 못한 방식으로 종료되면, 그로 인한 부작용이 발생할 가능성이 있다.
crossinline을 사용해서 해결해보자
비지역 반환 문제는 crossinline을 이용해서 막을 수 있다.
inline을 붙여주고 람다 파라미터에 crossinline을 붙여주면 된다.
crossinline이 붙은 람다 파라미터에 return을 쓴 람다를 넣으면 'return' is not allowed here 에러가 발생한다.
crossinline 적용하고 있는 곳
crossinline을 실제로 사용하고 있는 코드들을 찾아봤다.
Sequence
compareBy
'Kotlin' 카테고리의 다른 글
[Kotlin] Kotlin 공식 문서 번역 - 데이터 클래스 (Data classes) (0) | 2023.08.26 |
---|---|
[Kotlin] Kotlin 공식 문서 번역 - 클래스 (Classes) (0) | 2023.08.26 |
[Kotlin] inline 사용법 (3) - noinline 사용법 (0) | 2023.08.15 |
[Kotlin] inline 사용법 (2) - reified 사용법 (0) | 2023.08.15 |
[Kotlin] inline 사용법 (1) - 왜 inline function, class, property를 사용하는 걸까? (0) | 2023.08.13 |
댓글