✅ 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 |