책/Effective Kotlin

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

2023. 7. 3. 23:40
목차
  1. 1. 제한의 의미와 장점
  2. 2. 아규먼트
  3. 3. 상태
  4. 4. Assert 계열 함수 사용
  5. 5. nullablity와 스마트 캐스팅
본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.

 

1. 제한의 의미와 장점

반드시 특정 흐름으로 코드가 동작해야 한다면 예외를 활용해 제한을 걸어줄 수 있다.

제한을 걸면 다음과 같은 장점이 있다.

  • 제약사항을 쉽게 확인할 수 있다
  • 예상치 못한 동작을 하기에 앞서 예외를 throw한다 (= 안전한 애플리케이션이 된다)
  • 코드를 잘못 쓰는 상황을 막을 수 있다
  • 스마트 캐스트 기능을 활용할 수 있다

 

 

2. 아규먼트

require 블록을 사용하면 아규먼트를 제한할 수 있다.

fun factorial(n: Int): Long {
    require(n >= 0)
    return if (n <= 1) 1 else factorial(n - 1) * n
}

fun findClusters(points: List<Point>): List<Cluster> {
    require(points.isNotEmpty())
    // ...
}

fun sendEmail(user: User, message: String) {
    requireNotNull(user.email)
    require(isValidEmail(user.email))
    // ...
}

// 람다를 활용한 지연 메시지
fun factorial(n: Int): Long {
    require(n >= 0) { "Cannot calculate factorial of $n because it is smaller than 0" }
    return if (n <= 1) 1 else factorial(n - 1) * n
}
  • require 함수는 조건을 만족하지 못할 때 무조건적으로 IllegalArgumentException을 발생시킨다
  • require 함수에 람다를 넘겨서 지연 메시지를 사용할 수 있다

 

 

 

3. 상태

check 블록을 이용하면 상태를 제한할 수 있다.

fun speak(text: String) {
    check(isInitialized)
    // ...
}

fun getUserInfo(): UserInfo {
    checkNotNull(token)
    // ...
}

fun next(): T {
    check(isOpen)
    // ...
}
  • check 함수는 조건을 만족하지 못할 때 무조건적으로 IllegalStateException을 발생시킨다

 

 

4. Assert 계열 함수 사용

assert 블록은 테스트모드에서만 작동하며 실행 과정에서 true 여부를 파악할 수 있다.

fun pop(num: Int = 1): List<T> {
    // ...
    assert(ret.size == num)
    return ret
}

assert는 위 두 함수보다 쓸 일이 거의 없을 듯 하다. 예외를 던지는 것도 아니고 테스트성 코드가 운영코드에 섞여버린다. 차라리 위 두 함수를 쓰는 게 낫다고 본다.

 

 

5. nullablity와 스마트 캐스팅

1) 스마트 캐스팅

require와 check 블록으로 어떤 조건을 확인해서 true가 나왔다면 해당 조건은 이후로도 true로 가정한다.

따라서 이를 활용하여 타입 비교를 하면 스마트 캐스트가 작동한다.

이는 nullablity를 체크할 때 유용하다.

fun changeDress(person: Person) {
    require(person.outfit is Dress)
    val dress: Dress = person.outfit
    // ...
}

fun sendEmail(person: Person, message: String) {
    require(person.email != null)
    val email: String = person.email
}

// notNull을 체크할 땐 requireNotNull, checkNotNull을 사용할 수 있다.
fun sendEmail(person: Person, text: String) {
    val email = requireNotNull(person.email)
    validateEmail(email)
}

fun sendEmail(person: Person, text: String) {
    checkNotNull(person.email)
    validateEmail(person.email)
    // ...
}

 

2) Elvis 연산자 이용해서 nullablity 처리하기

Elvis 연산자 오른쪽에 throw나 return을 두고 Elvis 연산자를 활용할 수 있다.

fun sendEmail(person: Person, text: String) {
    val email: String = person.email ?: return
}

// 복잡한 처리를 사용할 땐 run 함수를 사용할 수 있다.
fun sendEmail(person: Person, text: String) {
    val email: String = person.email ?: run {
        log("Email not sent, no email address")
        return
    }
    // ...
}
저작자표시 비영리 (새창열림)

'책 > Effective Kotlin' 카테고리의 다른 글

[이펙티브 코틀린] 아이템8: 적절하게 null을 처리하라  (0) 2023.07.04
[이펙티브 코틀린] 아이템7: 결과 부족이 발생할 경우 null과 Failure를 사용하라  (0) 2023.07.04
[이펙티브 코틀린] 아이템4: inferred 타입으로 리턴하지 말자  (0) 2023.07.02
[이펙티브 코틀린] 아이템3: 최대한 플랫폼 타입을 사용하지 말라  (0) 2023.07.01
[이펙티브 코틀린] 아이템2: 변수의 스코프를 최소화하라  (0) 2023.06.30
  1. 1. 제한의 의미와 장점
  2. 2. 아규먼트
  3. 3. 상태
  4. 4. Assert 계열 함수 사용
  5. 5. nullablity와 스마트 캐스팅
'책/Effective Kotlin' 카테고리의 다른 글
  • [이펙티브 코틀린] 아이템8: 적절하게 null을 처리하라
  • [이펙티브 코틀린] 아이템7: 결과 부족이 발생할 경우 null과 Failure를 사용하라
  • [이펙티브 코틀린] 아이템4: inferred 타입으로 리턴하지 말자
  • [이펙티브 코틀린] 아이템3: 최대한 플랫폼 타입을 사용하지 말라
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • 그래프 탐색
  • mysql
  • dp
  • 그래프
  • atdd
  • 장고
  • Git
  • 백준
  • 깊이 우선 탐색
  • fastapi
  • 파이썬
  • BOJ
  • 브루트포스
  • Shortest Path
  • http

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[이펙티브 코틀린] 아이템5: 예외를 활용해 코드에 제한을 걸어라
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.