1. 객체와 변수
컴퓨터 프로그램에서 객체는 현실 세계의 사물을 표현하는 것이라고 생각할 수 있다. 예를 들어, "자동차"라는 객체는 속성(색상, 속도)과 행동(가속, 감속)을 가질 수 있다.
변수는 이러한 객체를 가리키는 이름표 같은 거다. 예를 들어, myCar라는 변수는 "자동차" 객체를 가리킬 수 있다.
2. null
null은 "아무것도 없다"는 뜻이다. 즉, 변수가 어떤 객체도 가리키고 있지 않을 때 사용하는 특별한 값이다. 예를 들어, myCar = null은 myCar가 현재 어떤 자동차도 가리키고 있지 않다는 뜻이다.
NullPointerException은 프로그래밍할 때 아주 흔히 발생하는 오류 중 하나다. 이 오류는 프로그램이 null인 변수를 사용하려고 할 때 발생한다. 쉽게 말하면, 아무것도 가리키고 있지 않은 변수로 뭔가 하려고 할 때 생기는 문제다.
Kotlin은 null을 안전하게 다룰 수 있도록 설계되어 있다. 기본적으로 변수는 null을 가질 수 없고, null을 가질 수 있는 변수는 따로 표시해야 한다. 이를 통해 NPE를 방지할 수 있다.
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 출력
변수나 객체가 Null 값을 가질 수 없음을 보장하는 타입이다.
Non-null 단언 연산자 !!
Null이 아님을 단언할 때 사용한다. 만약 Null이면 NullPointerException을 발생시킨다.
// nullableName이 Null이면 런타임 에러 발생
val length = nullableName!!.length
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
}
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"
}
null일 경우 기본값 반환
엘비스 연산자는 왼쪽의 표현식이 null인지 확인하고, null이면 오른쪽의 값을 반환한다. 이를 통해 null을 안전하게 처리하고, 기본값을 제공할 수 있다.
주로 사용되는 상황
변수에 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"
}