언어/Kotlin

[EffectiveKotlin] 예외를 활용해 코드에 제한을 걸어라

원석💎-dev 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 블록

실제 코드를 테스트 할 때만 동작 개인적으로는 비추

반응형