코틀린 언어의 주요 특징 중 하나
Null Pointer Exception[NPE] 에 대한 안정성을 보유한 언어
코틀린은 기본적으로 null값을 저장할 수 없다
따라서 null값을 저장할 수 있는 타입을 명식적으로 구분하여 사용하도록 하고 있다
변수에 null을 대입하고 싶다면 ? 키워드를 붙여 nullable한 변수임을 명시한다
ex) var s2:String? = null
🔨 nullable 변수들을 사용할 때 특이한 멤버접근 연산자들
- ?.
- 넘어온 값이 null이면 실행 x null이 아니면 실행ㄴ
- ?: -> 엘비스 연산자
- 객체가 null 일때 null 대신 default값 지정하기
- !! -> non-null asserted call 연산자
- 많은 매개변수들이 nullable로 되 어있음 그럴 때 쓴다
- null이 아님을 확실할 때 사용하는 연산자
- as? -> 안전한 캐스팅(형변환) 연산자
- 자료형이 맞지 않는 타입
package com.bsj0420.ex01kotlinhello
fun main() {
//코틀린 언어의 주요 특징 중 하나
//Null Pointer Exception[NPE] 에 대한 안정성을 보유한 언어
//코틀린은 null값을 저장할 수 없다
//그래서 null값을 저장할 수 있는 타입을 명식적으로 구분하여
//사용하도록 하고 있다
//var s1:String = null // 에러 : non-nullable 변수
var s2:String? = null //nullable 변수
println(s2)
// nullable 변수들을 사용할 때 특이한 멤버접근 연산자들
// . 연산자가 아닌...
var str1:String = "Hello" // non-nullable variable
var str2:String? = "Nice" // nullable variable
var str3:String? = null // nullable variable
//멤버 사용법의 차이
println("글자수 : ${str1.length}")
//println("글자수 : ${str2.length}") //error . 에 에러 - null일수도 있어서 막 사용하지 말라고 에러로 표시
//해결방법 : null이 아닐때만 하도록 if문
if (str2!=null) {
//이 영역은 null이 아님이 확실
println("글자수 : ${str2.length}") //에러 메세지 안뜬다
}
//위 if문 처리는 해결은 되지만 번거로움
//그래서 등장한 null안정성 접든 연산자들
//1) ?. 연산자
println("?. 글자수 str2 : ${str2?.length}")// 만약 null이 아니면 length 구동
println("?. 글자수 str3 : ${str3?.length}")// null이면 null이라고 나옴
//2)
//객체가 null 일때 null 대신 default값 지정하기
//객체가 null이면 길이값 -1 나오도록 해보기
val len:Int = if(str3 != null) str3.length else -1
println(len)
//if else 문이 번거롭다면
// ?: 연산자 - 엘비스 연산자
val len2:Int = str3?.length ?: -1
println(len2)
//3) non-null asserted call 연산자 : !!
//이런식으로 NPE에 안전한 연산자 기능이 있지만
//이 기능을 사용하지 않고 그냥 null이면 예외처리
//다시 말해, null이 아님을 확실할 때 사용하는 연산자
var ss:String?="Hello"
println("글자수 : ${ss!!.length}")
var sss:String?= null
//println("글자수 : ${sss!!.length}") // NullPointerException 발생
println()
// !! 쓰는 예 - 논 널어블 변수에 널어블 변수를 넣을 때 사용
var mmm:String? = "Nice"
//var nnn:String = mmm // !! 안쓰면 error
var nnn:String = mmm!!; // 값 전달 할 때
var ttt:String = "Good"
var xxx:String? = ttt // 그냥 ok
//4) 안전한 캐스팅(형변환) 연산자 as? - 자료형이 맞지 않는 타입
val yyy:YYY?= YYY()
//val zzz:ZZZ?= yyy
//val zzz:ZZZ ?= yyy as ZZZ // ClassCastException - 억지로 형변환 하면 에러 표시는 없지만 Exception 발생
//안전하게 형변환을 수행하는 연산자
val zzz:ZZZ? = yyy as? ZZZ // 형변환이 불가하면 에러가 아니라 null값을 전달
println(zzz) // -> null
}
class YYY {
var a = 10
}
class ZZZ {
var a = 20
}