require와 check를 알아보자

김태영·2024년 6월 10일
0

TIL

목록 보기
25/70
post-thumbnail

오늘 공부한 것

- 알고리즘 피보나치 수 풀이
- Kotlin 문법 종합반 강의 5주차
- 개인 과제 해설 보고 코드 개선

예외 처리 함수

전에 사용자 입력을 받을 때, 예외가 발생할 수 있는 구문을 try 블록으로 감싸는 방식을 사용했었다.

try {
    result = x % y
    println("나머지 결과 >> $result")
} catch (e: ArithmeticException) {
    result = -1
    println("0으로는 나눌 수 없습니다.")
}

이 때 나는 사실, 예외 처리를 할 수 있는 방식은 try-catch 밖에 없는 줄 알았다. 그러나 코틀린에는 require()check() 라는 예외 처리 함수가 있다고 한다. 그리고 놀랐던건,

일반적인 코틀린 코드에서 try-catch를 사용하면 안된다.

라는 사실을 알게되었다. 이 글에 따르면, 코틀린에서 예외의 주요 목적은 개발자에게 코드의 버그를 경고하는 역할이지, 프로그램의 요구사항을 충족하기 위해 사용하는 역할이 아니라는 것이다! 나는 그저 나누는 수가 0이면 안된다는 프로그램의 요구사항에 맞추려고 try-catch를 사용했는데, 이 방법은 결코 좋은 방법이 아니었다.

require

require() 는 매개변수의 값을 체크하는 함수로, 잘못된 인자가 들어왔을 때 기본적으로 IllegalArgumentException 을 발생시킨다.

⭐ IllegalArgumentException

적절하지 않은 인자를 전달했을 때 발생

다음 코드에서는 require() 의 두 번째 매개변수인 lazyMessage로 ArithmeticException을 넣어주었기 때문에 해당 예외가 발생하게 된다.

// 괄호가 거짓이라면 ArithmeticException throw
require(y != 0) {
    ArithmeticException("Divide by Zero")
}
return (x / y).toDouble()

추가로, 매개변수가 null인지를 체크해주는 requireNotNull() 도 있다고 한다.

check

require과 비슷하지만, 기본적으로 IllegalStateException 을 발생시킨다는 차이점이 있다. 똑같이 null인지를 체크해주는 checkNotNull() 이 있고, 두 번째 매개변수 lazyMessage를 통해 예외를 발생시키거나 예외 메시지를 설정해줄 수 있다.

⭐ IllegalStateException

메소드를 호출할 상태가 아닐 때 발생

check(state.isNotEmpty()) { "잘못된 상태" }

require vs. check

던지는 예외가 다르다는 것 빼고는 똑같은 기능인 것 같지만, 사용하는 상황이 다르다고 한다.

  • require
    • 매개변수 값의 유효성을 검사할 때 사용
    • ex. email check, num 의 값을 체크
  • check
    • 구체적인 조건을 만족할 때(특정 상태일 때)만 함수를 실행시키고 싶을 때 사용
    • 어떤 객체가 미리 초기화 되어 있어야만 처리를 하게하는 경우
    • 사용자가 로그인 했을 때만 처리를 하게 하고 싶은 경우
    • 객체를 사용할 수 있는 시점에 사용하고 싶은 경우
profile
화이팅

0개의 댓글