1. 코틀린의 null
코틀린의 모든 타입은 기본적으로 널이 될 수 없는 타입으로 되어있습니다. 하지만 무언가 null 결과를 내놓아야 한다면
타입 뒤에 물음표?를 붙여서 결과가 null이 될 수도 있음을 표시해야합니다.
fun main() {
val a = 1
val b: Int = null
}
fun main() {
val s1 = "널널하구만~"
val s2 : String? = null
val s3: String? = s1 // ?를 통해 널이 될 수 있음을 표시
}
위의 예제와 같이 null 참조를 저장할 수 있는 식별자를 정의하려면 타입 이름 뒤에 ?를 붙여야 합니다. 이렇게 정의된 식별자는 null이나 정상적인 값을 모두 담을 수 있습니다.
1-1 널이될 수 없는 타입에 널이 될 수 있는 타입을 대입하는 경우
val s3: String? = s1 // ?를 통해 널이 될 수 있음을 표시
val s4: String = s3 // 에러!!
널이될 수 있는 타입의 식별자를 널이 될 수 없는 타입의 식별자에 대입은 불가능합니다. (String과 String?는 다른 타입으로 취급)
1-2 null이 될 수 있는 타입의 참조
val s1: String = "널이 아닙니다유"
val s2: String? = s1;
val len = s1.length
val len2 = s2.length // 에러 발생!!!
대부분의 타입의 값은 메모리에 있는 객체에 대한 참조로 저장되는데 코틀린에서는 null이 될 수 있는 타입을 단순히 역참조할 수 없습니다.
( => NullPointerException이 발생할 수 있기 때문)
널이될 수 있는 타입에 대한 참조를 허용하려면 명시적으로 참조가 null인지 검사하는 과정이 필요합니다.
if(s2 != null) println(s2.length)
명시적으로 검사를 수행하고 나면 코틀린은 널이 될 수 있는 객체를 참조할 수 있도록 허용해줍니다.
1-3 안전한 호출
안전한 호출은 일반 호출에 사용하는 . 을 -> ?. 으로 바꾼 것으로 안전한 호출을 사용하면 널이 될 수 있는 타입의 멤버에 접근하면서 예외가 발생하지 않도록 해줍니다. (null이 아닐 때만 연산을 수행함)
if(s2 != null) println(s2.length)
println(s2?.length)// 다음과 같은 형태로도 사용이 가능
1-4 널 복합 연산자
코틀린은 널 복합 연산자를 제공합니다.
fun main() {
val s1: String = "널이 아닙니다유"
val s2: String? = null
println(s1 ?: "널입니다")
println(s2 ?: "널입니다")
}
널이 아닙니다유
널입니다
?: 의 왼쪽 식의 값이 null이 아니면 왼쪽 식의 값이 결괏값이 되고,
왼쪽식이 null이라면 ?:의 오른쪽 식의 값이 결과 값이 됩니다.
1-5 널 아님 단언
널 아님 단언은 null이 될 수 없다고 주장하는 것으로 !!를 통해 표현할 수 있습니다.
fun main() {
val s1: String = "널이 아닙니다유"
val s2: String? = null
println(s1!!)
println(s2!!) //NPE 발생!
println(s2!!.length) //역 참조와도 함께 쓰인다
}
s2!!는 s2가 null일 수도 있다는 사실을 무시해라 내가 null이 아님을 보증한다!는 뜻으로 s2가 null이 아니라면 s2의 값을 내놓고 null이면 NPE를 발생시킵니다.
2. 총정리
기본 원칙: 코틀린은 기본적으로 널이 될 수 없는 타입을 사용
널 허용: ?를 사용하여 널 값을 허용합니다.
널 참조 시 규칙:
- 직접 참조 불가 → null 체크 필요
- ?. (안전한 호출) 사용 가능
널 복합 연산자: ?:로 null 대신 기본값 지정 가능.
널 아님 단언: !!로 NPE를 감수하고 널을 무시 가능.
'Kotlin 정리' 카테고리의 다른 글
[Kotlin 공부 10일차] 상속, 기반 클래스 초기화 (0) | 2024.12.20 |
---|---|
[Kotlin 공부 9일차] 인터페이스 (0) | 2024.12.17 |
[Kotlin 공부 7일차] 데이터 클래스, 구조 분해 선언 (0) | 2024.12.10 |
[Kotlin 공부 6일차] 오버로딩, when (0) | 2024.12.06 |
[Kotlin 공부 5일차] 확장 함수, 이름 붙은 인자와 디폴트 인자 (0) | 2024.12.04 |