Kotlin 코딩테스트 문법 시리즈 ⑯ : 널 처리 & 안전 호출

2025. 7. 16. 05:39·Code Odyssey

✅ Kotlin은 Java와 달리 **널 안정성(null-safety)**을 언어 차원에서 강력하게 보장합니다. 이 시리즈에서는 안전 호출 연산자, Elvis 연산자, let, ?. 등의 널 처리 방법을 실전 중심으로 정리합니다.


🔹 1. Nullable 타입 선언

val name: String = "Arum"     // Non-null
val nickname: String? = null   // Nullable
  • String : null 허용 ❌
  • String? : null 허용 ⭕

🔹 2. 안전 호출 연산자 ?.

val length = name?.length  // name이 null이면 전체 결과는 null
  • null이 아닐 경우만 뒤를 실행
  • null이면 전체가 null 반환

🔍 예시

val s: String? = null
println(s?.length) // null

🔹 3. Elvis 연산자 ?:

val result = name?.length ?: 0
  • 좌측이 null이면 우측 값 반환
  • Java의 a != null ? a.length : 0과 동일

🔍 예시

val s: String? = null
val len = s?.length ?: -1
println(len) // -1

🔹 4. Safe Cast as?

val obj: Any = "Hello"
val str: String? = obj as? String
  • 타입이 맞지 않으면 예외 대신 null 반환

🔹 5. let 함수와 null-safe 처리

val name: String? = "Arum"
name?.let {
    println("Hello, $it")
}
  • ?.let {}: null이 아닐 때만 실행됨
  • 내부에서는 it으로 해당 값을 사용 가능

🔹 6. requireNotNull, checkNotNull

val s: String? = "Hi"
val nonNull = requireNotNull(s) { "값이 null이면 예외" }
  • null이면 IllegalArgumentException 또는 IllegalStateException 발생
  • 주로 매개변수 체크에 사용

🔹 7. !! (non-null 단언 연산자)

val s: String? = "Hello"
val len = s!!.length
  • 무조건 null이 아니라고 단언 → null이면 NullPointerException 발생
  • 절대 코딩테스트에서 남용 금지 ❌

🔹 8. takeIf / takeUnless

val name = "Kotlin"
val result = name.takeIf { it.length > 3 }    // 조건 만족 시 반환
val result2 = name.takeUnless { it.isBlank() } // 조건 불만족 시 반환
  • 반환 타입은 nullable
  • ?.let {}, ?:, ?: run {} 등과 함께 안전한 처리 흐름 구성 가능

🔹 9. runCatching으로 예외 안전 처리

val result = runCatching { "42".toInt() }.getOrNull()
println(result) // 42

val fail = runCatching { "a".toInt() }.getOrNull()
println(fail) // null
  • 예외가 발생해도 null로 안전하게 반환
  • 예외 발생 여부는 .isSuccess, .exceptionOrNull() 등으로 확인 가능

🔹 10. 기타 널 처리 실전 팁

✅ if (x != null) vs x?.let {}

둘 다 null 체크지만,

  • x != null은 전통적인 방식 (Java 스타일)
  • x?.let {}은 함수형 스타일 → 체이닝 가능, 가독성 ↑
if (name != null) println(name.length)
// vs
name?.let { println(it.length) }

✅ nullable 컬렉션 조건 검사

if (items?.isEmpty() == false) {
    // null도 아니고, 비어있지도 않을 때
}
  • null-safe 하면서도 조건 분기 가능

✅ 초기값 없이 선언한 nullable 변수 처리

var username: String? = null
val displayName = username ?: "(비회원)"
  • null이면 기본값으로 대체 가능 (?: 활용)

✅ 정리

연산자/함수 설명 예시
?. 안전 호출 연산자 val len = name?.length
?: null일 경우 기본값 반환 (Elvis) val len = name ?: "익명"
!! null 아님을 강제 단언 val len = name!!
as? 타입 캐스팅 실패 시 null val str = obj as? String
requireNotNull null 검사 후 예외 발생 requireNotNull(input)
let null 아닐 경우 블록 실행 name?.let { println(it) }

 

다음 시리즈 ⑰ : 타입 변환 & 확장 유틸으로 이어집니다. .

'Code Odyssey' 카테고리의 다른 글

[Android] Activity Lifecycle 실습 중 onDestroy() 이슈 정리  (0) 2025.08.19
Kotlin 코딩테스트 문법 시리즈 ⑰ : 타입 변환 & 확장 유틸  (1) 2025.07.17
Kotlin 코딩테스트 문법 시리즈 ⑮ : 람다, 수신 함수, 클로저 개념과 활용  (0) 2025.07.15
Kotlin 코딩테스트 문법 시리즈 ⑭ : 함수 패턴 정리  (3) 2025.07.14
Kotlin 코딩테스트 문법 시리즈 ⑬ : Scope Function 정리 (let, also, apply, run, takeIf)  (0) 2025.07.13
'Code Odyssey' 카테고리의 다른 글
  • [Android] Activity Lifecycle 실습 중 onDestroy() 이슈 정리
  • Kotlin 코딩테스트 문법 시리즈 ⑰ : 타입 변환 & 확장 유틸
  • Kotlin 코딩테스트 문법 시리즈 ⑮ : 람다, 수신 함수, 클로저 개념과 활용
  • Kotlin 코딩테스트 문법 시리즈 ⑭ : 함수 패턴 정리
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    boostcamp
    프로그래머스
    문법정리
    시뮬레이션
    Kotlin
    greedy
    코테
    Level3
    알고리즘고득점kit
    백준
    java
    Level2
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
Kotlin 코딩테스트 문법 시리즈 ⑯ : 널 처리 & 안전 호출
상단으로

티스토리툴바