-
🤔 Kotlin에서 Null 안정성을 보장하는 이유
- Java의 NPE(null pointer exception) 문제
- 자바는 모든 객체가 기본적으로 null을 허용해, 개발자가 별도로 null 체크를 해주어야 한다.
- 따라서 NPE이 발생하는 코드가 흔하며 이는 자바 개발자가 가장 많이 마주치는 오류중 하나이다.
- 이를 방지하기 위해 많은 양의 보일러플레이트 코드(명시적 null 체크)가 필요
- Kotlin 설계 철학
- 코틀린은 안전하고 간결한 코드 작성을 목표로 설계
- null 안정성을 언어차원에서 지원해 개발자의 실수를 방지하고 코드의 신뢰성을 높인다.
- 개발자가 명시적으로 null 가능성을 처리해 런타임 오류를 최소화
- 생산성과 가독성 향상
- null 체크를 자동화하고 코드 가독성을 높임으로써 개발 생산성 향상
- 명시적인 nullable 타입 선언과 연산자는 코드의 의도를 더 명확히 전달하게 한다.
🚀 Kotlin에서의 널 처리
1️⃣ Nullable Types(?)
- 코틀린에서 변수에 null을 허용할지 명시적으로 선언
val nonNullable: String = "Hello" // null 불가 val nullable: String? = null // null 가능
장점
- 컴파일 타임 체크 : null 관련 오류를 코드 작성 시점에 확인해 런타임 오류 방지
- 명시적으로 nullable 과 non-nullable 변수를 구분해 코드의 안정성과 가독성을 높인다.
2️⃣ ?. ( Safe calls )
- 객체가 null 인지 확인한 후 안전하게 호출
val length = nullableString?.length // nullableString이 null이라면 호출을 생략
장점
- NPE 방지 : null 인지 상태를 직접 확인하지 않아도 안전하게 호출이 가능
- 코드 간결화: 명시적인 null 체크를 위한 코드가 줄어든다.
3️⃣ ?: ( Elvis Operator)
- 값이 null인 경우 기본값 반환
val length = nullableString?.length ?: 0 // null이면 기본값 0 반환
장점
- Null 대체 값을 제공 : null 상황에서 처리해야 할 값을 쉽게 설정가능
- 의미 명확성: null을 처리하는 의도를 명확히 한다.
4️⃣ as? ( Safe casts )
- 객체를 특정 타입으로 변환하려고 할 때, 변환이 불가능할 시 null을 반환
- Java에서 강제 캐스팅에서 발생할 수 있는 ClassCastException을 방지
val hello: Any = "Hello" val str: String? = obj as? String // 성공 - Hello 반환 val number: Int? = obj as? Int // 실패 - null 반환
장점
- 안전하게 타입 변환을 시도할 수 있다.
5️⃣ !! ( not-null assertion )
- nullable 타입의 변수를 강제로 non-null 타입으로 변환
- 해당 변수가 null인 경우에는 NPE이 발생
- null이 아닌 것이 확실할 때 사용하는 도구이다.
val nullable: String? = null val length = nullable!!.length
⚠️ 주의
- 잘못 사용하면 런타임 오류를 유발할 수 있다.
- !! 보다는 안전한 다른 대안을 사용하는 것이 좋다.
6️⃣ let 함수
- 객체가 null이 아닌 경우에만 특정 작업을 수행할 때 사용
- null-safe call (?.) 과 함께 사용
val nullable: String? = "Hello" nullable?.let { println(it.length) }
장점
- null 을 명시적으로 처리하는 코드를 작성할 수 있다.
- 스코프 함수로, 변수의 스코프를 제한해 코드의 가독성을 높인다.
📖 Reference.
'🔖 Kotlin' 카테고리의 다른 글
👾 MockK와 Mockito (0) 2025.01.09 😎 Infix Function (0) 2024.12.30 🦥 lateinit 과 lazy (0) 2024.12.29 Kotlin Coroutines (0) 2024.12.28 Unit / Nothing (0) 2024.11.25 - Java의 NPE(null pointer exception) 문제