안녕하세요 이번 시간에는 널 가능성에 관련해서 개꿀떡 해보겠습니다.
1. 널이 될 수 있는 타입
- 코틀린에서는 널 값을 포함하는 타입과 그렇지 않은 타입을 구분해야한다.
- 널이 될 수도 있는 값을 받는 함수는 물음표("?")를 붙여 지정
① vs Java
- Java에서는 모든 참조 타입은 널이 될 수 있는 타입이지만 코틀린에서는 널이 될 수없는 타입이다.
(Java에서는 null 전달이 가능하지만 NPE에러가 나옴)
② 예시
< 코드 >
package com.example.kotlinbase.Nullable
// 널 가능 파라미터 사용한 함수 예시
fun isOdd(iNumber: Int?): Boolean {
// 반드시 null 값 처리
if(iNumber == null) return false
else return iNumber % 2 != 0
}
fun main() {
val iNum1: Int = 11
val iNum2: Int = 32
// val iNum3: Int = null // ?가 없으면 널 불가
val iNum3: Int? = null // ? 붙여 널 가능
println(isOdd(iNum1))
println(isOdd(iNum2))
println(isOdd(iNum3)) // 파라미터가 널 가능이므로 사용 가능
}
< 결과 >
2. 널 가능성과 스마트 캐스트
- 널이 될 수 있는 값을 처리하는 가장 직접적인 방법은 조건문을 사용해 null과 비교하는 것이다.
- null에 대한 검사 로직을 추가하면 코틀린 기능인 "스마트 캐스트"로 인해 컴파일이 된다.
- 스마트 캐스트는 when이나 루프 같으 조건 검사가 들어가는 다른문이나 식에도 작동 한다.
- 널 검사로직과 사용 지점 사이에 값이 변경되면 스마트 캐스트가 작동하지 않는다.
① 예시
< 코드 >
package com.example.kotlinbase.Nullable
// 스마트캐스트 예시
fun sizeNumber(iNumber: Int?) = when (iNumber) {
null -> "NULL"
in 0..10 -> "Small"
in 11 .. 100 -> "Large"
else -> "Out of range"
}
fun main() {
println(sizeNumber(null))
println(sizeNumber(32))
// 널 검사 이후에 널 검사한 변수가 변경 되었으므로 오류 발생 예시
var sString = readLine()
if(sString != null) {
sString = readLine()
// println(sString.length)
}
}
< 결과 >
3. 널 아님 단언 연산자
- 널이 아닐 경우 "!!" 연산자를 사용하고 널이 될 수없다.
① 예시
< 코드 >
package com.example.kotlinbase.Nullable
// 널 아님 단언 예시
fun main() {
var sName = readLine()!!.toString()
println("내이름은 $sName 입니다.")
}
< 결과 >
4. 안전한 호출 연산자
- 널이 아닌 경우에는 동작을하고, 널인 경우에는 널을 반환하는 연산자는 "?." 이다.
① 예시
< 코드 >
package com.example.kotlinbase.Nullable
// 널 아님 단언 예시
fun main() {
var sName = readLine()?.toString()
println("내이름은 $sName 입니다.")
// 위 ?. 연산자를 풀어 쓸경우 아래와 같은 식이 된다.
var sName2 = readLine()
if(sName2 != null) sName2.toString()
else null
println("내이름은 $sName 입니다.")
}
< 결과 >
5. 엘비스 연산자
- 널이 될 수 있는 값을 다룰 떄 유용한 연산자이고 "?:"을 사용한다.
- 왼쪽 피연산자의 결과가 널이 아닐경우 왼쪽 값이고 널일 경우 오른쪽 값을 의미한다.
- return, throw문 사용이 가능 하다.
- 연산 우선순위는 중위연산자와 비슷하고, 비교/동등 연산자 보다 우선순위가 높다.
① 예시
< 코드 >
package com.example.kotlinbase.Nullable
fun sayHello(name: String?) {
// 엘비스 연산자 사용 예시
println("Hello, ${(name ?: "이름모름")}")
}
fun main() {
sayHello("개꿀떡")
sayHello(null)
}
< 결과 >
이번 시간에는 코틀린에서는 Null과 관련되서 어떻게 타입을 처리하는지에 관해 개꿀떡 해보았습니다. 자바보다 코틀린을 사용하는 이유중하나인 NPE(NullPointException)을 피하기위해 사용하기 유용하다고 생각합니다. 감사합니다 :)
'조재연의 Kotlin 개꿀떡 > 조재연의 Kotlin 기초 개꿀떡' 카테고리의 다른 글
Kotlin 기초 - 클래스 정의 (0) | 2023.04.03 |
---|---|
Kotlin 기초 - 기초 함수 (0) | 2023.03.13 |
Kotlin 기초 - 기초 언어 (1) | 2023.03.08 |
Kotlin 기초 - 안드로이드 스튜디오(Android Studio)로 문법 연습하기 (0) | 2023.01.28 |
Kotlin 기초 - 코틀린(Kotlin)이란? (0) | 2023.01.17 |