본문 바로가기
Kotlin

코틀린에서의 Null 값 처리

by 코드닭 2024. 4. 18.

NULL

null 은 아무것도 없는 것을 의미하는데 이것은 0, 공백과는 다른 개념이다
null은 프로그래밍에 아주 중요한 영향을 끼치는데 null로 인해 프로그램 전체, 혹은 앱 전체가 멈출 수 있다

 

 

null로 인해 프로그램이 멈출 수 있는 상황 예시▼

// null 을 참조하려다 오류
fun main() {
    val name: String? = null
    println("Name length: ${name.length}") // NullPointerException 발생
}

// 변수 초기화 없이 null 선언해서 오류
var one: One
if (1 > 2){
    one = One()
}
one.print()

 

코틀린은 null 처리에 공을 들인 언어로서 null의 안정성을 강화했다

 ?( Nullable )를 이용해서  null 값을 허용하거나 대체할 수 있다


  ?  :  (Nullable)null 허용 

  • ? : 변수, 함수파라미터에 null 허용

코틀린에서 사용하는 기본 변수는 모두 null 값을 입력할 수 없다

null 값을 입력하기 위해서는 변수를 선언할 때 타입 뒤에?(Nullable)를 입력하면 된다

  • null 체크

함수 파라미터에 null을 허용하려면 방식은 변수와 같되 null 체크를 해주어야 한다

// 변수에 null 값 허용 예시
var variable: String?

// 함수 파라미터와 함수 리턴에 null 값 허용 예시
fun codak(name: String?) : String? {
		if (name !=null) {                 
        	//null 이 아닐경우 실행
        } esle {
        	//null 일 경우 실행
        }   
}
// null 값을 체크해 주고 해당 파라미터를 사용
// 체크하지 않을경우 프로그램이 중단될 수 있음(NullPointerException)

 

마찬가지로 함수의 리턴값에도 null을 허용할 수 있다

fun nullReturn(): String? {
    return null
}
// return 타입에 nullalbe 지정을 해주지 않으면 null 값을 받아올 수 없다

 

 

 


 

 

?.  :  안전 호출 (Safety Call) = null이 아닌 경우 호출, null은 반환

nullable(null 허용)인 변수 다음에?. 를 사용해 변수가 null일 경우?. 다음의 메서드나 프로퍼티를 호출하지 않게 한다

// null 안전하게 호출하기
fun testSafeCall(str: String?): Int? {
    // str이 null이면 length를 체크하지 않고 null을 반환한다
    var resultNull: Int? = str?.length
    return resultNull
}
// 만약에 안전 호출 없이 str 변수가 null 이면 프로그램이 중단된다(NullPointerException)

 

 


 

 

?:  :  엘비스 연산자(Elvis Operator)  =   null 값 대체

원본 변수가 null일 때 넘겨줄 기본값을 설정한다

?.(Safety Call) 다음에 호출되는 프로퍼티 뒤에?:(Elvis Operator)를 붙인 후 기본값을 설정한다

fun testElvis(str: String?): Int {
    // length 오른쪽에 ?:을 사용하면 null일 경우 ?: 오른쪽의 값(0)이 반환
    var resultNonNull: Int = str?.length ?: 0
    return resultNonNull
}

 

 


 

 

as?  :  안전 캐스트(Safety Cast) : null 이 아닌 경우만 캐스트

변수가 null 이 아닌 경우에만 캐스트 하려면 캐스트 하려는 변수 뒤에 as? 를 붙여 안전한 캐스트를 할 수 있다

// str 을 String 으로 캐스트 후 null 이 아닐경우만 문장의 길이를 length 변수에 저장
// 만약 Str 캐스트가 되지 않는다면 null 이 반환되며 이경우 length 는 실행 X
val str: Any? = "Hello"
val length: Int? = (str as? String)?.length

 

 


 

  표기 사용 목적 사용 식
Nullable
(null 허용)
? null 값을 입력받을 수 있게함 var 변수명 : 타입?
Safety Call
(안전 호출)
?. null일 경우  속성 또는
명령어 처리를 막음
var 변수명=변수?.프로퍼티(or명령어)
Elvis Operator
(null 값 대체)
?: null일 경우 기본값으로 설정 var 변수명=변수(or프로퍼티)?:기본값
Safety Cast
(안전 캐스트)
as? null이 아닐  경우에만 캐스트 캐스트할변수명 as? 캐스트타입

 

 

 


 

!!  :  단언 연산자(assertion operator) = Null 안정성 해제

해당 표현식이 널(null)일 때 무시하고 그 값을 사용하도록 강제할 수 있다

널 포인터 예외(NullPointerException)를 발생시킬 수 있기 때문에  사용 시 주의해야한다

!! 연산자를 사용할 때는 해당 값이 절대로 널이 아님을 확신할 수 있는 상황에서만 사용해야 한다 

val input: Int = readln()!!.toInt       //입력값(Null이 아니라고 확신)을 변수 input 에 초기화
val input2: Int = readln()!!.toInt      //입력값(Null이 아니라고 확신)을 변수 input2 에 초기화

val sum: Int = input + input2

 

fun main() {
    var nullString: String? = null
    val length = nullString!!.length // !! 연산자를 사용하여 널을 강제로 해제
    println("문자열의 길이는 $length")
}
// NullPointerException 발생, 에러

'Kotlin' 카테고리의 다른 글

스코프 함수  (0) 2024.04.22
lateinit, lazy  (0) 2024.04.19
클래스(Class)  (0) 2024.04.16
함수  (0) 2024.04.11
반복문  (0) 2024.04.09