코틀린의 변수 선언은 기본적으로 null을 허용하지 않음
val a: Int
위처럼 선언만 하고, 값이 들어있지 않은 경우 null이라고 함.
이러한 상태에서 참조할 경우 에러가 발생.
따라서, null값을 쓰기 위해서는 아래처럼 null이 가능한 선언을 해야 함
val a: Int? = null
→ 단순 출력은 상관 없으나 널인 상태에서 연산된는 멤버에 접근할 때 nullPointerException가 발생
(사용할 수 없는 null인 변수에 접근하면서 발생하는 예외)
fun main() {
var str1: String?
str1 = null
println("str1: $str1")
}
fun main() {
var str1: String?
str1 = null
println("str1: $str1, length: ${str1.length}")
}
null값에 접근해 연산을 하려 했기에 오류가 발생하는 것을 확인할 수 있다.
이처럼 null의 가능성이 존재하거나 null인 경우, safe call(?.)을 호출할 수 있다.
fun main() {
var str1: String?
str1 = null
println("str1: $str1, length: ${str1?.length}")
}
❗safe call은 null 값이 발생한 경우, safe call 이후의 명령문을 수행하지 않는다❗
!!는 널이 아닐 것이라고 단정하여 컴파일러가 오류를 무시하게 함.
fun main() {
var str1: String?
str1 = "hi"
println("str1: $str1, length: ${str1!!length}")
}
fun main() {
var str1: String?
str1 = null
println("str1: $str1, length: ${str1!!length}")
}
이 경우 NEP가 발생.
따라서, 최대한 쓰지 않는 것이 좋음.
또한, if문을 이용해 미리 검사할 수 있음.
fun main(){
var str1: String?
str1 = null
val len = if(str1 != null) str1.length else -1
println("str1: $str1, length: $len ")
}
이를 아래처럼 엘비스 연산자로 간단하게 줄여 표현할 수 있음.
fun main(){
var str1: String?
str1 = null
val len = str1?.length ?: -1 //safe call을 이용해 더 안전하게 사용 가능
println("str1: $str1, length: $len ")
}
변환 메소드의 이용
val a: Int = 1
val b: Double = a.toDouble()
변환 메소드에는 아래와 같은 종류가 있다.
표현식에서 자료형의 자동 변환
val result = 1L + 3
// Long형과 Int형의 연산, 더 큰 Long으로 자동 형 변환
val a: Int = 128
val b: Int? = 128
println(a == b)
println( a === b)
구체적으로 명시되지 않은 자료형을 자동 변환할 때 사용
fun main(){
var test: Number = 12.2 //Float형
println("$test")
var test: Number = 12 //Int형
println("$test")
var test: Number = 120l //Long형
println("$test")
var test: Number = 12.0f //Float형
println("$test")
}
데이터의 자료형을 사용할 때 사용.
val num = 256
if(num is Int){
print(num)}
else (num !is Int) //!(num is Int){
print("not")}
▼ any 형으로 인자 받는 함수 만들기
fun main(){
checkArg("hello")
checkArg(5)
}
fun checkArg(x: Any){
if(x is String){
println("x is String: $x")
}
if(x is Int){
println("x is Int: $x")
}
}