코틀린 Null 안전성이란?
자바와 다르게 코틀린은 Nullable과 Non-Null 타입으로 프로퍼티를 선언할 수 있다!
즉, 코틀린은 기본적으로 값이 null 아니고 NotNull이다.
🙄❔❓왜 기본적으로 값이 Null이 아닐까?
Java를 포함한 많은 프로그래밍 언어에서 가장 많이 발생하는 오류는 NPE(NullPointerException)이다.
코틀린은 코드에서 NPE(NullPointerException)을 제거하기 위함이라고 한다.
null참조 코드의 위험성을 없애기 위해라고 보면 될 것 같다.
하지만 기본적으로 값이 null을 가지는 프로퍼티를 선언할 수 없다는 것이지
null값을 허용하는Nullable 타입으로 프로퍼티를 선언할 수 있다.
❗Nullable(널이 될 수 있는)과 Non-Null(널이 될 수 없는) 타입
var nullable: String? = null // 컴파일 성공
var nonNull: String = null // 컴파일 에러
위와 같은 코드에서 타입을 선언할 때
- ?를 붙이면 → null 할당 가능 프로퍼티
-?를 붙이지 않으면 → null 할당 불가능 프로퍼티
따라서 nonNull에 null을 할당하려고 하면 컴파일 에러가 발생
🙄❔❓그러면 코틀린에서 Null Pointer Exception(NPE)이 발생하는 경우는 없는 걸까?
→ "아니요?" 라고 말할 수 있다.
코틀린에서는 NPE(NullPointerException)가 발생하지 않을 것 같지만 자바 라이브러리를 쓰는 경우 발생 가능
자바는 Non-Null 타입이 없기 때문에 자바 라이브러리를 사용할 경우 Nullable 타입으로 리턴된다고 함
❗nullable 타입을 non-nullable 타입으로 변경하기
String getString() {
String str = "";
return str;
}
만약 코틀린에서 위와 같은 자바 라이브러리를 사용한다고 가정할 때
String을 리턴하며, 코틀린에서는 이 타입을 Nullable인 String?으로 인식함
하지만 코틀린에서 이 함수의 리턴 값을 non-nullable인 String으로 변환하고 싶다고 가정해보자.
그럼 이 프로퍼티가 항상 null이 아닌 것을 보장할 수 있고, try-catch로 NPE를 처리하지 않아도 된다.
하지만 아래 코드처럼 대입하면 컴파일 에러가 발생한다.
var nonNullString: String = getString()
→ String? 타입을 String타입에 할당하려고 했기 때문이다.
❗❕❓❔ 그러면 어떻게 해야 해
var nonNullString: String = getString()!!
→!! 연산자를 사용하면 된다!!
-!! 연산자는 객체가 Null이 아닌 것을 보장함
- 만약 Null이라면 NPE(NullPointerException) 발생 시킴
(이런 이유로!! 연산자는 null이 아닌 것을 보장할 수 있는 객체에만 사용 가능)
안전하게 nullable 프로퍼티 접근하는 여러가지 방법
2021.10.26 - [프로그래밍/Kotlin] - [ Kotlin ] 코틀린(Kotlin)에서 Null 을 안전하게 처리하는 방법
'프로그래밍 > Kotlin' 카테고리의 다른 글
[ Kotlin ] 코틀린 val , var 이란? 그리고 차이점 (0) | 2021.11.03 |
---|---|
[ Kotlin ] 코틀린(Kotlin) lateinit과 by lazy (0) | 2021.10.26 |
[ Kotlin ] 코틀린(Kotlin)에서 Null 을 안전하게 처리하는 방법 (1) | 2021.10.26 |