
해당 글은 참고에 작성된 글을 번역하여 작성한 글입니다!
Kotlin 2.1.0 출시와 함께, 개발자들은 when 구문에 대한 오랫동안 기다려왔던 개선사항인 ‘가이드 조건(guard conditions’)을 사용할 수 있게 되었습니다. 이 추가 기능은 when 구문에서 케이스를 평가할 때 추가 조건(가드)을 지정할 수 있게 함으로써 코드의 가독성과 유연성을 향상 시킵니다.
가드 조건은 표준 타입이나 값 평가를 넘어서 추가적인 검사를 수행할 수 있게 함으로써 when 구문에 추가적인 로직 계층을 더합니다. 이전에는 추가적인 when 구문이나 if 표현식을 사용할 수 밖에 없었습니다. 이제는 하나의 case 내에서 직접 복잡한 조건들을 정의할 수 있습니다.
sealed 클래스인 HttpResult를 사용하는 시나리오를 보겠습니다.
sealed interface HttpResult {
data class Success(val response: String) : HttpResult
data class Failed(val statusCode: Int) : HttpResult
}
when (response) {
is HttpResult.Success -> println("Success")
is HttpResult.Failed if response.statusCode == 503 -> println("Maintenance")
is HttpResult.Failed -> println("Failed with code ${response.statusCode}")
}
HttpResult.Failed를 특정 상태 코드 (503)와 함께 처리하는 로직이 when 구문에 매끄럽게 통합되어, 코드를 간결하고 읽기 쉽게 유지할 수 있게 되었습니다.
가드 조건이 없었다면
when (response) {
is HttpResult.Success -> println("Success")
is HttpResult.Failed -> {
if (response.statusCode == 503) {
println("Maintenance")
} else {
println("Failed with code ${response.statusCode}")
}
}
}
다음과 같이 Failed 내부에서 if문이나 when문을 사용하여 한번 더 처리해줬어야 했습니다.
가드 조건이 추가적인 유연성을 제공하긴 하지만, when 구문의 중요한 속성은 여전히 유지됩니다.
→ 모든 경우를 처리해야 한다는 것!
컴파일러는 여전히 when 구문에서 모든 가능한 경우를 처리하도록 요구할 것이기 때문입니다. 특히 sealed 클래스를 다룰때는 말입니다.
예를 들어 다음코드는 HttpResult의 모든 경우를 처리하지 않았기 때문에 컴파일 에러가 발생할 수 있습니다.
when (response) {
is HttpResult.Success -> println("Success")
is HttpResult.Failed if response.statusCode == 503 -> println("Maintenance")
}
이를 해결하기 위해서는, 다른 모든 HttpResult.Failed 인스턴스에 대한 case를 추가해야 합니다. is HttpResult.Failed → 를 추가하여 when 구문이 모든 경우를 처리하도록 해야 합니다.
이 기능은 프리뷰 상태이며, 선택적으로 사용할 수 있고 프로젝트에서 명시적으로 활성화해야 합니다.
다음은 build.gradle.kts에서 guards 옵션을 켜줍니다.
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xwhen-guards")
}
}
가드 조건은 다음과 같은 시나리오에서 유용합니다.
Kotlin 2.1.0에서 도입된 가드 조건은 명확하고 유지보수가 가능한 코드를 작성하는 것을 단순화하는 작지만 강력한 개선사항입니다. 하지만 when 구문은 여전히 모든 경우를 처리해야 한다는 점을 명심하세요. 이는 추가된 유연성에도 불구하고 로직이 견고하게 유지되도록 보장합니다.
https://medium.com/@tom.sabel/kotlin-2-1-0-smarter-when-with-guard-conditions-4541160d67a0