[Kotlin] 예외 처리 - require(), check()

해니·2024년 10월 22일

Kotlin

목록 보기
6/9
post-thumbnail

이펙티브 코틀린 아이템5 - 예외를 활용해 코드에 제한을 걸어라

  • require : argument를 제한할 수 있다.
  • check: 상태와 관련된 동작을 제한할 수 있다.
  • assert: 어떤 것이 true인지 확인할 수 있다. (assert 테스트 모드에서만 작동)
  • return 또는 throw와 함께 활용하는 Elvis 연산자



require(), requireNotNull()

  • require()
    • 매개변수 값이 true인지 체크한다.
    • false라면 IllegalArgumentException을 발생시킨다.
  • requireNotNull()
    • 매개변수 값이 null이 아니면 value를 반환한다.
    • null이면 IllegalArgumentException을 발생시킨다.

💻 IllegalArgumentException

  • 사용자가 잘못된 값을 입력하는 경우에 발생한다.
  • 사용자의 잘못으로 발생하는 에러를 대표한다.

require() 에시

fun calculate(vale: Stirng?){
	// require() 사용 전 
    if(value.isNullOrEmpty()){
    	throw IllegalArgumentException("값이 null 혹은 공백입니다.")
    }
    
    // require() 사웅 후
    rqruie(!value.isNullOrEmpty()) {"값이 null 혹은 공백입니다."}
}

requireNotNull() 에시

enum class Operator(val op: String) {
	PLUS("+"), MINUS("-)


  // requireNotNull() 사용 전 
  fun convertToOperator(op: String): Operator {
      return entries.toTypedArray().firstOrNull { it.op == op } ?: throw IllegalArgumentException("사칙연산 기호가 아닙니다.")
  }


  // requireNotNull() 사용 후
  fun convertToOperator(op: String): Operator {
      return requireNotNull(entries.toTypedArray().firstOrNull {it.op == op}) {"사칙연산 기호가 아닙니다."}
  }

}

Enum entries.toTypedArray() 💭
: Kotlin 1.9.0을 사용할 경우, enum을 쓴다면 value() 대신 entries 사용을 권장한다고 한다. Enum values함수는 열거된 상수들을 배열 형태로 반환하는데, 배열은 기본적으로 내부 요소가 변경될 수 있기 때문에 Enumvalues는 매번 객체를 생성하는 구조로 설계될 수밖에 없다.



check(), checkNotNull()

  • check()

    • 매개변수 값이 true인지 체크한다.
    • false이면 IllegalStateException을 발생시킨다.
  • checkNotNull()

    • 매개변수 값이 null이 아니라면 value를 반환한다.
    • null이면 IllegalStateException을 발생시킨다.

🎮 IllegalStateException
: 사용자가 올바른 값을 입력했지만, 코드가 값을 처리할 준비가 되지 않은 경우 발생한다.
ex) 체스 게임을 진행해야 하는데 체스판이 없는 경우



check() 예시

fun connect (isConnected: Boolean, connectJob: () -> Unit) {
	
    // check() 사용 전
    if(isConnected) {
    	throw IllegalStateException("이미 연결되어 있습니다.")
    }
    
    
    // check() 사용 후
    check(!isConnected) {"이미 연결되어 있습니다."}
    
    connectJob()
}

checkNotNull() 예시

class BleDevice {
	var connectedState: String? = null
    
    fun connect(connectJob: () -> Unit) {
    	// checkNotNull() 적용 전
        val state = if (connectedState == null) {
        	throw IllegalStateException("이미 연결되어 있습니다.")
        } else {
        	connectedState
        }
        
        // checkNotNull 사용 후
        val state2 = checkNotNull(connectedState)
        
        connectJob()
    }
}



마무리 .. 😵‍💫💭
코틀린 토이 프로젝트에서 유효성 검사 로직을 수정 중 .... Java에만 익숙해져서 Kotlin 다운 코드를 작성하려고 학습 중인데 어느 케이스에서 사용해야 할지 헷갈리고
공부해야될 내용이 양파 까듯 계속 나온다 ... 계속 하다보면 Kotlin도 익숙해지겠지 ...?





출처
Kotlin의 check()와 require()
[Kotlin] Kotlin 예외처리
IllegalArgumentException, IllegalStateException
[Kotlin] enum 사용 시 values() 대신 entries를 써라?

profile
💻 ⚾️ 🐻 이전했어요..! ➡️ https://dev-haeni.tistory.com/

0개의 댓글