프로그래밍/Kotlin

[ Kotlin ] 코틀린 Null 안전성이란? (Null Safety)

리신 2021. 10. 25. 02:21
반응형

코틀린 Null 안전성이란?  

자바와 다르게 코틀린은 NullableNon-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)에서 Null 을 안전하게 처리하는 방법

코틀린 Null 안전성이란? 2021.10.25 - [프로그래밍/Kotlin] - [ Kotlin ] 코틀린 Null 안전성이란? (Null Safety) [ Kotlin ] 코틀린 Null 안전성이란? (Null Safety) 코틀린 Null 안전성이란? 자바와 다르게..

dev-cini.tistory.com

 

 

 

 

반응형