지금까지 각 변수에는 항상 어떠한 값이 제공되있어야 했다. 즉, 각 변수는 항상 특정한 개체를 참조하는데, 참조변수가 개체를 참조해서는 안되는 경우도 존재한다. 예를 들어 지금까지 만들어진 영화들 중 최고의 영화를 변수에 저장하고 싶다고가정해보자.
val bestMovie = TODO()
하지만 아직 제작된 영화가 없다면 과연 이 변수는 어떤 영화 개체를 참조해야 할까? 물론 아무 의미가 없는 Movie 개체를 따로 만들어 둘 수 있지만 우아(?)하지는 않은 방법이다. 어찌됐든 게임(영화만들기 게임)이 막 시작했을 때, 아직 최고의 영화로 지정된 영화는 존재할 수 없는 거니까...
1. Nullable Types
코틀린에서 참조변수가 아무것도 참조하지 않도록 하는 방법이 있다. null 키워드를 이용하면 된다. ( null 은 nothing 을 의미한다. ) 즉 어떤 개체도 참조되고 있지 않다는 뜻인데, 이는 위험한 방법이다. 만일 존재하지 않는 개체의 속성을 참조하려고 한다면 어떤 일이 일어나게 되는 걸까.
val bestMovie = null
bestMovie.title // 에러: Unresolved reference: title
존재하지 않는 개체의 속성을 참조하는 것은 당연히 불가능하다. 컴파일러 오류가 프로그래밍 시작 전 이미 뜬 것이 보인다. 이런 null 관련 오류는, 오류의 원인을 찾는 게 어려울 뿐더러, 때에 따라 수십억에 피해를 입힐 수도 있기 때문에 오류 방지를 사전에 제대로 해주는게 매우 중요하다.
우선, Kotlin은 모든 타입의 참조 변수가 아무것도 아닌 것을(Nothing) 참조하는 것을 허용하지 않는다. 따라서 다음 명령문은 허용되지 않아 컴파일러 오류가 발생한다.
반면에 java 에선 컴파일 시간에 이를 허용하고, 런타임 때 관련 오류를 인지 후 NullPointerException 을 던진다.
1.5 Nullable 하게 만들어주기
그러면 어떤 자료형의 참조 변수에게도 null을 입력가능하게 해주려면 어떻게 해야 할까? 매우 간단하다. null 허용여부는 자료형 뒤에 ?(물음표)를 붙여 표시해주면 된다.
val bestMovie : Movie? = null
[ 정리 ]
* 코틀린은 Null 타입을 Nullable 과 Non-Nullable 로 구분한다.
* 객체는 기본적으로 Non-Nullable 이다. (val bestMovie : Movie = null 에러가 뜬다.)
* 이는 기본값으로 null 을 가지는 프로퍼티 선언이 불가능 하다는 것이지만,
타입에 ?를 붙여 null 값을 허용하는 Nullable 타입으로 프로퍼티 선언이 가능하다.
* ?를 붙임으로써, 이 객체가 어떠한 값을 참조할 수도 있고, 아무것도 참조하지 않을 수도 있다는 걸 내포.
여기서 한가지 드는 의문점. 그럼 Movie 와 Movie?를 같은 타입이라 말할 수 있는 가? 이다. 놉! 둘은 명확하게 다른 타입이다.아래 예시를 보자.
infoOfBestMovie 는 Movie 타입을 파라매터로 받아 실행되는 함수다. 여기에 Movie? 타입을 가진 bestMovie는 파라매터로 집어넣기가 불가능하다. 사진에 Type mismatch 에러가 뜬 걸 볼 수 있다.
출처:
내용 / 도움준 곳: 학교 교수님 (Christian Kohls) 강의
'언어 > Kotlin' 카테고리의 다른 글
Kotlin : nullable 타입 안전하게 참조하기 (ft.Safe Call) (0) | 2022.11.09 |
---|---|
Kotlin : 인터페이스 (Interface) (0) | 2022.11.07 |
Kotlin : 추상클래스 (Abstract class) (0) | 2022.11.05 |
Kotlin : Object Composition & Aggregation 이란 (0) | 2022.11.03 |
Kotlin : Movie Maker 에서 Object 키워드 사용해보기 (1) | 2022.11.03 |