-
[EffectiveKotlin] 예외를 활용해 코드에 제한을 걸어라언어/Kotlin 2022. 3. 17. 14:07반응형
1. require 블록
파라미터에 대한 제한을 걸때 사용
IllegalArgumentException 발생
fun find(points: List<Point>): List<T> { require(points.isNotEmpty()) // 조건에 만족하지 않는다면, IllegalArgumentException // IllegalArgumentException에 message를 넣고싶다면, // require(points.isNotEmpty()) { "error Message" }로 메세지를 넘겨줄 수 있다. . . . }
2. check 블록
상태에 대한 제한을 걸때 사용
IllegalStateException을 발생
// 예제1 class Bank { fun isOpen: Boolean = ... fun find(points: List<Point>): List<T> { check(isOpen) . . . }
// 예제2 class User { val token: String? . . . fun getUser() { checkNotNull(token) . . . } }
3. nullability와 스마트 캐스팅
require와 check 블록을 통과하면 해당 조건은 이후로도 true인 것으로 간주한다.
- 스마트 캐스트
fun changeDress(person: Person) { require(person.outfit is Dress) val dress: Dress = person.outfit }
- 언팩(unpack) 용도로 사용
fun sendEmail(person: Person) { val email = requireNotNull(person.email) . . . }
require은 Unit을 리턴하기 때문에 unpack용도로 사용할 수 없다.
- Exception 없이 우아하게 함수 끝내기
fun sendEmail(person: Person) { val email: String = person.email ?: return // 엘비스 연산자 사용 . . . } // 끝내기전 로그 남기기 fun sendEmail(person: Person) { val email: String = person.email ?: run { log("email is null") return } . . . }
4. assert 블록
실제 코드를 테스트 할 때만 동작 개인적으로는 비추
반응형'언어 > Kotlin' 카테고리의 다른 글
함수 리턴의 표현 Unit과 Nothing (0) 2022.03.17 lateinit 사용하기 (0) 2022.03.17 [EffectiveKotlin] 가독성을 목표로 설계하라 (0) 2022.03.16 [EffectiveKotlin] 타입을 명확하게 지정하라 (0) 2022.03.13 [EffectiveKotlin] 최대한 플랫폼 타입을 사용하지 말라 (0) 2022.03.10