Kotlin 2.1.0에서 더 똑똑해진 'When'

HEETAE HEO·2024년 12월 2일
post-thumbnail

해당 글은 참고에 작성된 글을 번역하여 작성한 글입니다!

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 구문의 중요한 속성은 여전히 유지됩니다.

→ 모든 경우를 처리해야 한다는 것!

컴파일러는 여전히 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 구문이 모든 경우를 처리하도록 해야 합니다.

어떻게 적용가능할까요?

이 기능은 프리뷰 상태이며, 선택적으로 사용할 수 있고 프로젝트에서 명시적으로 활성화해야 합니다.

k2 컴파일러에서만 가능

  1. Go to Settings → Languages & Frameworks → Kotlin
  2. Check Enable K2 mode, 활성화. 비활성화를 설정하고 IDE를 재시작 합니다.

컴파일러 옵션 추가하기 (build.gradle.kts)

다음은 build.gradle.kts에서 guards 옵션을 켜줍니다.

kotlin {
	compilerOptions {
		freeCompilerArgs.add("-Xwhen-guards")
	}
}

어디서 사용이 가능할까?

가드 조건은 다음과 같은 시나리오에서 유용합니다.

  • 복잡한 when 구문과 특정 검사를 다룰 때
  • sealed 클래스나 enum을 사용하여 다형성을 처리할 때
  • 다양한 값과 상태의 조합을 평가할 때 로직을 깔끔하고 간결하게 유지하고 싶을 때

결론

Kotlin 2.1.0에서 도입된 가드 조건은 명확하고 유지보수가 가능한 코드를 작성하는 것을 단순화하는 작지만 강력한 개선사항입니다. 하지만 when 구문은 여전히 모든 경우를 처리해야 한다는 점을 명심하세요. 이는 추가된 유연성에도 불구하고 로직이 견고하게 유지되도록 보장합니다.

references

https://medium.com/@tom.sabel/kotlin-2-1-0-smarter-when-with-guard-conditions-4541160d67a0

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글