GDSC HUFS 4기/Kotlin Team #3

[3팀] Android-12-Kotlin: Nullable

홓옇 2022. 10. 2. 22:02

이 글은 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 값일 경우 다른 값을 할당시킬 수 있음을 확인할 수 있다.

 

티스토리 블로그 포스팅을 마치도록 하겠습니다. 감사합니다.