일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 에러
- 싱글톤
- 알고리즘
- dfs
- Render object tree
- 완전탐색
- Singleton
- Java
- zwj
- Lazy
- element tree
- Widget Tree
- Android
- 재귀
- 프리즈드
- 플러터 동작
- Kotlin
- 비동기 처리
- 자바
- 자료구조
- 프로그래머스
- flutter
- 코틀린
- linebreak
- 앱아이콘 변경
- 초기화
- IOS
- dart
- 플러터
- 거리알고리즘
- Today
- Total
모바일 개발하는 자바리안의 메모장
Kotlin - Null Safety (?, !!) 본문
코틀린은 슬기로운 초기화를 위해 다양한 기능들을 제공해준다.
이는 자바에서 쉽게 발생하던 NullPointerException에 대한 사전 방지를 위해 선언 단계부터 엄격하게 관리를 해주는거라는데,,
Null Safety를 위해 코틀린에선 어떤 방식으로 Nullable를 관리해주는지 알아보자.
아래 코드를 보자 :
fun main() {
var str : String = "text"
str = null // Error
}
위와 같은에러가 발생한다. 왜와이? 익숙하게 선언한 String 타입에 null은 해당되지 않기 때문이다.
그렇다면 nullable한 타입은 어떻게 선언해주면 될까?
fun main() {
var str : String? = "text"
str = null // Good
}
간단하게 타입 뒤에 ? 를 붙여주면 된다.
자바에서는 물음표라곤 삼항연산자 사용할때만 썼던 것 같은데,, 코틀린에서서는 사용할 일이 아주 많다..
물음표 연산자는 또 어떤 상황에 쓰일까 ?
다음 코드를 보자 :
fun main() {
var str : String? = "text"
val len : Int = str.length // Error
}
위와 같은 에러가 발생한다. nullable 한 타입으로 선언했음에도, 메소드 혹은 인스턴스 변수에 접근하기 위해서는 nullable을 명시해야한다.
우선, 에러 메시지에서 친절하게 알려 준 2개 suggestions 중에 ?.(Safe Call) 을 사용하여 length를 확인해보자 :
fun main() {
var str : String? = "text"
val len : Int = str?.length // Good. Returns 4
}
Safe Call은 nullable한 객체에 사용할 수 있으며, null일 경우 null을 반환해준다.
그 다음으로 !!. (non-null assertion) 을 사용하여 호출해보자.
Kotlin팀에선 해당 연산자를 NPE Lover들을 위해 준비했다고 깜찍하게 코멘트를 달아놨다.
솔직히 의도는 잘 모르겠지만 Safe Call 과는 다르게 객체가 null 일 경우 Null Pointer Exception이 발생한다 :
fun main() {
var str : String? = "text"
if(str == "text") {
str = null
}
val len : Int = str!!.length // NullPointerException
}
부끄럽지만,, 실제 코틀린으로 개발을하며 올바른 null처리가 아닌, 모든 것을 한번에 해결해주는 쌍느낌표를 난사할 때가 있었는데,,
Kotlin팀에서 이렇게까지 Null Safety에 공을 들인걸 생각해서라도 정확한 null 처리를 통해 보다 안정적인 서비스를 만들 수 있도록 더 신경써야겠다.
'Android > Android.Kotlin' 카테고리의 다른 글
Kotlin - object & companion object (0) | 2023.04.14 |
---|---|
Kotlin - lazy (0) | 2021.12.22 |
Kotlin - 변수 초기화(Initialization) (0) | 2021.12.14 |