반응형
7. Nullable / NonNull
자바와 다른 코틀린만의 가장 큰 특징이라고 할 수 있는 부분이다. 자바에서는 NPE 때문에 굉장히 고생을 한다.
NPE는 Null Pointer Exception 오류의 약자이다. 자바에서 컴파일 시점에서는 발견할 수 없고 런타임 시점에서만 발견할 수 있기 때문에 매우 불편하다. 하지만 코틀린에서는 이것을 컴파일 시험에서 잡을 수 있도록 ? 가 있다.
fun nullcheck(){
var name : String = "joyce" // NonNull타입
var nullname : String = null // NonNull타입에 null을 넣었기 때문에
// 에러(Null can not be a value of a non-null type String)발생
var nullname2 : String? = null // 변수타입뒤에 ?를 넣어주면 Nullable타입이 됩.
// 따라서 널을 넣고싶으면 ?를 써줘야하기 때문에 변수타입을 생략하면 안된다.
// 함수을 사용하기위해선 null이면 안되는데 이를 간단하게 체크할 수 있다.
// 스트링 클래스에 기본적으로 포함되어있는, 모든 문자열을 대문자로 바꾸어주는 toUpperCase 함수를 예시로 사용
var nameInUpperCase = name.toUpperCase()
var nullNameInUpperCase = nullname2.toUpperCase()
// Nullalbe타입을 그냥 쓰면 에러 발생
// Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? 에러 발생
var nullNameInUpperCase2 = nullname2?.toUpperCase()
// 이와같이 Nullable타입 뒤에는 ?를 붙여주면된다.
// Nullname2가 Null이 아니면 toUpperCase를 실행하고 Null이면 Null로 반환
// ?: 엘비스 연산자라고 함.
// 엘비스 연산자 ?앞의 변수가 널 값이라면 반환할 값을 :뒤에 지정해준다.
val lastName : String? = null
val fullName = name + (lastName?: "No LastName")
// lastname이 null이면 name + "No LastName" 출력
// lastname이 null이아니면 정상적으로 출력( name + lastName )
println(fullName) // joyce No LastName 출력
var lastName2 = "Hong"
val fullName2 = name + (lastName2?: "No LastName")
println(fullName2) // joyce Hong 출력
}
자바와 다르게 코틀린은 굊아히 편리하게 null관리를 할 수 있다.
아래의 코드는 !! 연산자의 사용 예시이다. !! 연산자 또한 ?:(엘비스연산자)와 ? 연산자 만큼 많이 쓰인다.
!! 연산자는 Nuallable로 타입이 지정되어 있지만 null이 아닌 것을 보장할 때 사용한다.
fun ifnoreNulls(str : String?){
val mNotNull : String = str // Type mismatch.Required: String Found: String? 에러발생
val mNotNull2 : String = str!! // !! 연산자를 사용하여 컴파일러에게 null이 아니라고 명시해줌
val upper = mNotNull2.toUpperCase() // !!연산자를 사용해주었기 때문에 ?연산자를 사용하지 않아도 된다.
// 주의 사항으로는 정말 확실하게 null이 아닌이상 !!는 잘 안쓰는 것이 좋다. null값이 들어가면 NPE오류가 발생하기 때문
val email : String? ="soopeachxxx@nana.com"
// email이 null이 아니면 let함수를 실행하고 null이면 실행하지 않는다(안전)
// let함수는 자신의 리시버 객체(email)를 람다식 내부로 옮겨서 실행하는 구문이다.
email?.let{
println("my email is ${email}")
// my email is soopeachxxx@nana.com 출력
}
}
위에 작성된 코드 및 설명들은
에서 코틀린 강의 영상을 보며 정리한 내용입니다.
반응형
'코틀린[Kotlin]' 카테고리의 다른 글
코틀린[Kotlin] 컬렉션 API : filter, map, all, any, count, find(firstOrNull) (0) | 2022.02.21 |
---|---|
코틀린[Kotlin] 가위바위보하고 결과를 출력해주기 (0) | 2022.02.04 |
코틀린[Kotlin] 람다기초(Lambda) (0) | 2022.01.21 |
코틀린[Kotlin] 기초(조건문, Array 및 List, 반복문) (0) | 2022.01.19 |
코틀린[Kotlin] 기초(함수, val와 var의 차이, String Template) (0) | 2022.01.18 |
최근댓글