이 글은 Android12 및 코틀린 완전 정복을 참고하여 작성하였습니다.
작성자 : 정호영
개발환경은 Windows, Android Studio입니다.
1. 코틀린에서 Nullable을 지원하게 된 이유.
자바와 비교해보면 자바에서 가장 많이 발생하는 오류 중 하나로 NPE (NullPointerException) 이며 코틀린에서는 이 에러를 방지하기 위해 Nullable 타입을 지원한다.
→ NullPointerException 런타임에러 ( 어디서 에러가 발생했는지 찾는게 보다 힘듬. )
→ 코틀린에서는 Nullable 타입을 지원하여 컴파일에러가 발생토록 함.
var name: String = "코틀린"
// name = null // Compilation Error
var nullableName: String? = "코틀린"
nullableName = null // Works
2. Nullable 선언 방식
코틀린에서 변수에 지정해주는 기본 값은 Non-Null 타입이다.
var nullable: String? = null (컴파일 성공, Nullable 타입)
var nonNull: String = null (컴파일 에러, Non-Null 타입)
val nullableList: List<Int?> = listOf(1, 3, 5, null, 9)
null 값 확인하는 방법으로는 if-else 를 사용
val nullableName: String? = "Kotlin"
if(nullableName != null) {
println("스터디 과목은 ${nullableName.toLowerCase()}")
println("스터디 과목의 길이는 ${nullableName.length} 자 입니다.")
} else {
println("아무 과목을 수강하지 않습니다.")
}
3. Safe Call
코틀린에서는 Safe Call 을 지원하고 ?. 로 표현한다
var study : String? = "Kotlin"
// case 1
if(study != null) {
study.toLowerCase()
} else null
// case 2
study?.toLowerCase()
예제를 통해 Safe Call 사용법을 확인할 수 있다.
val group: String? = null
println(group?.toLowerCase()) // prints null
println(group?.length) // prints null
group 변수가 null 값이라면 toLowerCase() 와 length를 실행시키지 않고 null 값을 출력한다.
null 값을 출력하는 것이 아니라 null 일 때는 출력하지 않고 null 이 아닐 때는 문장을 출력하고 싶다면 let, it을 사용하면 된다.
val myHobby: String? = null
myHobby?.let { println(it.toLowerCase()) }
myHobby?.let { println(it.length) }
4. 엘비스 연산자
엘비스 연산자는 ?: 으로 표현하고 디폴트값을 설정할 때 주로 사용된다.
?: 을 기준으로 왼쪽이 null 이 아니면 그 값을 리턴하고, null 이면 지정한 default 값을 리턴한다.
val str: String? = "1234"
val nullStr: String? = null
var len: Int = str?.length ?: 0
println("str.length: $len") // print 4
var len2 = nullStr?.length ?: 0
println("nullStr.length: $len") // print 0
추가로 Null 값이 아님을 보증하는 !! 연산자가 있다. !! 을 사용함으로써 컴파일 에러를 발생시키지는 않지만 null 값이 할당되어 있을 경우 NPE 런타임에러를 발생시킨다.
var test1 : String? = null
var test2 : String? = "스터디 코틀린"
print(test1!!.length) // NPE 발생
print(test2!!.length) // 성공
5. 자바의 Nullable ?
자바에서도 Nullable 과 비슷한 Optional 클래스가 존재한다.
public final class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
private Optional() {
this.value = null;
}
public T orElse(T other) {
return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
// 생략
}
orElse() 나 orElseGet() 메소드를 보면 코틀린에서 엘비스연산자와 같이 null 값일 경우 다른 값을 할당시킬 수 있음을 확인할 수 있다.
티스토리 블로그 포스팅을 마치도록 하겠습니다. 감사합니다.
'GDSC HUFS 4기 > Kotlin Team #3' 카테고리의 다른 글
[3팀] Android-12-kotlin Interface and Abstract class (1) | 2022.10.07 |
---|---|
[3팀] Android-12-Kotlin: Conditions and Loops (0) | 2022.10.03 |
[3팀] Android-12-Kotlin: 변수설정과 데이터 유형 (0) | 2022.10.03 |
[3팀] Android-12-Kotlin: QUIZ (0) | 2022.10.02 |
[3팀] Android-12-Kotlin: 산술 연산자와 유형의 중요성 ~ When 식 (0) | 2022.10.02 |