Null

Anna·2024년 6월 4일
0

코틀린

목록 보기
12/28
post-thumbnail

기본 개념

1. 객체와 변수
컴퓨터 프로그램에서 객체는 현실 세계의 사물을 표현하는 것이라고 생각할 수 있다. 예를 들어, "자동차"라는 객체는 속성(색상, 속도)과 행동(가속, 감속)을 가질 수 있다.
변수는 이러한 객체를 가리키는 이름표 같은 거다. 예를 들어, myCar라는 변수는 "자동차" 객체를 가리킬 수 있다.

2. null
null은 "아무것도 없다"는 뜻이다. 즉, 변수가 어떤 객체도 가리키고 있지 않을 때 사용하는 특별한 값이다. 예를 들어, myCar = null은 myCar가 현재 어떤 자동차도 가리키고 있지 않다는 뜻이다.


NPE(NullPointerException)

NullPointerException은 프로그래밍할 때 아주 흔히 발생하는 오류 중 하나다. 이 오류는 프로그램이 null인 변수를 사용하려고 할 때 발생한다. 쉽게 말하면, 아무것도 가리키고 있지 않은 변수로 뭔가 하려고 할 때 생기는 문제다.

Kotlin에서의 NPE

Kotlin은 null을 안전하게 다룰 수 있도록 설계되어 있다. 기본적으로 변수는 null을 가질 수 없고, null을 가질 수 있는 변수는 따로 표시해야 한다. 이를 통해 NPE를 방지할 수 있다.


Null

Null 객체를 선언할때 변수 타입 옆에 ? 를 붙이면 Null 사용이 가능하도록 할당할 수 있다.

var nullable: String? = null

//변수는 String 타입이므로 null을 가질 수 없음
var nonNullable1: String = "Kotlin" 

//변수가 String? 타입으로 선언, null허용
//초기값으로 "Kotlin"이 할당되어 있어 정상적으로 값을 출력
var nonNullable2: String? = "Kotlin"  

println(nullable) // null 출력
println(nonNullable) // Kotlin 출력

non-null

변수나 객체가 Null 값을 가질 수 없음을 보장하는 타입이다.
Non-null 단언 연산자 !! Null이 아님을 단언할 때 사용한다. 만약 Null이면 NullPointerException을 발생시킨다.

// nullableName이 Null이면 런타임 에러 발생
val length = nullableName!!.length 

Safe-call

Kotlin에서 null 안정성을 보장하기 위해 제공하는 도구 중 하나다. 이 연산자는 ?.로 표시되며, 변수나 객체가 null일 수 있는 상황에서 안전하게 접근할 수 있도록 도와준다.
?.를 사용하면 해당 객체가 null이 아닐 때만 뒤따르는 메서드나 속성을 호출하게 되고, 만약 null이라면 그냥 null을 반환해.

fun main() 
{
    var nullable: String? = null
    
    // null이므로 safe call 연산자에 의해 null 출력
    println(nullable?.length)    // 출력 결과 null
    
    nullable = "Kotlin"
    
    // null이 아니므로 length 속성을 호출해 길이 출력
    println(nullable?.length)    // 출력 결과 6
}

Elvis operator 엘비스 연산자

Kotlin에서 제공하는 null 안정성을 보장하기 위한 도구 중 하나다. 엘비스 연산자는 ?:로 표시되며, 변수나 표현식이 null일 경우 대체값을 제공할 수 있다.

fun main() 
{
    var nullable: String? = null

    // nullable이 null이므로 기본값 "Default Value"가 반환됨
    val result1 = nullable ?: "Default Value"
    println(result1)     // 출력 결과 "Default Value"

    nullable = "Kotlin"

    // nullable이 null이 아니므로 nullable의 값이 반환됨
    val result2 = nullable ?: "Default Value"
    println(result2)    // 출력 결과 "Kotlin"
}
  1. null일 경우 기본값 반환
    엘비스 연산자는 왼쪽의 표현식이 null인지 확인하고, null이면 오른쪽의 값을 반환한다. 이를 통해 null을 안전하게 처리하고, 기본값을 제공할 수 있다.

  2. 주로 사용되는 상황
    변수에 null이 들어올 수 있는 경우 기본값을 제공하고 싶을 때
    함수의 결과가 null일 때 대체값을 지정하고 싶을 때

// 이 함수는 user 객체를 인자로 받으며, 이 객체는 null일 수도 있다.
fun getUserName(user: User?): String 
{
	//user가 null이 아닌 경우 user.name을 반환
    //user가 null이라면 "Unknown"을 반환
    return user?.name ?: "Unknown"
}

data class User(val name: String)

fun main() 
{
	//user1은 User 객체로 "Alice"라는 이름을 가지고 있다.
    val user1: User? = User("Alice")
    //user2는 null이다. 
    val user2: User? = null

    println(getUserName(user1))   // 출력 결과 "Alice"
    println(getUserName(user2))   // 출력 결과 "Unknown"
}

0개의 댓글