NULL
null 은 아무것도 없는 것을 의미하는데 이것은 0, 공백과는 다른 개념이다
null은 프로그래밍에 아주 중요한 영향을 끼치는데 null로 인해 프로그램 전체, 혹은 앱 전체가 멈출 수 있다
null로 인해 프로그램이 멈출 수 있는 상황 예시▼
// null 을 참조하려다 오류
fun main() {
val name: String? = null
println("Name length: ${name.length}") // NullPointerException 발생
}
// 변수 초기화 없이 null 선언해서 오류
var one: One
if (1 > 2){
one = One()
}
one.print()
코틀린은 null 처리에 공을 들인 언어로서 null의 안정성을 강화했다
?( Nullable )를 이용해서 null 값을 허용하거나 대체할 수 있다
? : (Nullable) = null 허용
- ? : 변수, 함수파라미터에 null 허용
코틀린에서 사용하는 기본 변수는 모두 null 값을 입력할 수 없다
null 값을 입력하기 위해서는 변수를 선언할 때 타입 뒤에?(Nullable)를 입력하면 된다
- null 체크
함수 파라미터에 null을 허용하려면 방식은 변수와 같되 null 체크를 해주어야 한다
// 변수에 null 값 허용 예시
var variable: String?
// 함수 파라미터와 함수 리턴에 null 값 허용 예시
fun codak(name: String?) : String? {
if (name !=null) {
//null 이 아닐경우 실행
} esle {
//null 일 경우 실행
}
}
// null 값을 체크해 주고 해당 파라미터를 사용
// 체크하지 않을경우 프로그램이 중단될 수 있음(NullPointerException)
마찬가지로 함수의 리턴값에도 null을 허용할 수 있다
fun nullReturn(): String? {
return null
}
// return 타입에 nullalbe 지정을 해주지 않으면 null 값을 받아올 수 없다
?. : 안전 호출 (Safety Call) = null이 아닌 경우 호출, null은 반환
nullable(null 허용)인 변수 다음에?. 를 사용해 변수가 null일 경우?. 다음의 메서드나 프로퍼티를 호출하지 않게 한다
// null 안전하게 호출하기
fun testSafeCall(str: String?): Int? {
// str이 null이면 length를 체크하지 않고 null을 반환한다
var resultNull: Int? = str?.length
return resultNull
}
// 만약에 안전 호출 없이 str 변수가 null 이면 프로그램이 중단된다(NullPointerException)
?: : 엘비스 연산자(Elvis Operator) = null 값 대체
원본 변수가 null일 때 넘겨줄 기본값을 설정한다
?.(Safety Call) 다음에 호출되는 프로퍼티 뒤에?:(Elvis Operator)를 붙인 후 기본값을 설정한다
fun testElvis(str: String?): Int {
// length 오른쪽에 ?:을 사용하면 null일 경우 ?: 오른쪽의 값(0)이 반환
var resultNonNull: Int = str?.length ?: 0
return resultNonNull
}
as? : 안전 캐스트(Safety Cast) : null 이 아닌 경우만 캐스트
변수가 null 이 아닌 경우에만 캐스트 하려면 캐스트 하려는 변수 뒤에 as? 를 붙여 안전한 캐스트를 할 수 있다
// str 을 String 으로 캐스트 후 null 이 아닐경우만 문장의 길이를 length 변수에 저장
// 만약 Str 캐스트가 되지 않는다면 null 이 반환되며 이경우 length 는 실행 X
val str: Any? = "Hello"
val length: Int? = (str as? String)?.length
표기 | 사용 목적 | 사용 식 | |
Nullable (null 허용) |
? | null 값을 입력받을 수 있게함 | var 변수명 : 타입? |
Safety Call (안전 호출) |
?. | null일 경우 속성 또는 명령어 처리를 막음 |
var 변수명=변수?.프로퍼티(or명령어) |
Elvis Operator (null 값 대체) |
?: | null일 경우 기본값으로 설정 | var 변수명=변수(or프로퍼티)?:기본값 |
Safety Cast (안전 캐스트) |
as? | null이 아닐 경우에만 캐스트 | 캐스트할변수명 as? 캐스트타입 |
!! : 단언 연산자(assertion operator) = Null 안정성 해제
해당 표현식이 널(null)일 때 무시하고 그 값을 사용하도록 강제할 수 있다
널 포인터 예외(NullPointerException)를 발생시킬 수 있기 때문에 사용 시 주의해야한다
!! 연산자를 사용할 때는 해당 값이 절대로 널이 아님을 확신할 수 있는 상황에서만 사용해야 한다
val input: Int = readln()!!.toInt //입력값(Null이 아니라고 확신)을 변수 input 에 초기화
val input2: Int = readln()!!.toInt //입력값(Null이 아니라고 확신)을 변수 input2 에 초기화
val sum: Int = input + input2
fun main() {
var nullString: String? = null
val length = nullString!!.length // !! 연산자를 사용하여 널을 강제로 해제
println("문자열의 길이는 $length")
}
// NullPointerException 발생, 에러
'Kotlin' 카테고리의 다른 글
스코프 함수 (0) | 2024.04.22 |
---|---|
lateinit, lazy (0) | 2024.04.19 |
클래스(Class) (0) | 2024.04.16 |
함수 (0) | 2024.04.11 |
반복문 (0) | 2024.04.09 |