아래 예시 코드를 보자.
물론 nullable 타입인 Movie? 타입의 bestMovie 가 아무 제한 없이 Movie 클래스의 속성에 참조할 수 있다면 위험하다. 아무것도 아닌 객체의 속성 참조는 NullPointerException을 일으킬 수 있기 때문에 (이를 코틀린에서는 런타임 전에 컴파일러를 통해 알려주긴 하다만). 그러면 참조하기 전에 그 객체가 정말 존재하는 객체인지 확인 후, 참조하면 되는 거 아닐까?
1. null 확인하기
bestMovie 가 실제 객체를 참조하는게 확실한 경우, 즉 Movie 타입을 참조하고 있다면 그 타입 속성에 참조하는게 가능하다. => 아래처럼 if 절을 이용해서 확인하면 된다.
var bestMovie : Movie? = null
if(bestMovie != null){
bestMovie.title
}
2. Safe Call
위에서 언급한 확인검사(?)는 굉장히 자주 이루어 질 수 있어서, 더 쉽게 가능하게 하기 위해 이를 위한 스페셜한 연산자가 하나 있다. Safe Call 연산자로 불리는데 ?. 을 사용해서 나타낸다. 이 물음표는 대상 객체가 정말 존재하는지 의문이니 참조를 위해 실제 존재 여부가 파악되어야 해요 를 의미한다고 보면 된다.
var bestMovie : Movie? = null
bestMovie?.title
이제 bestMovie가 null 이 아닌 경우에만 bestMovie가 Movied의 속성 중 하나인 title 에 참조할 수 있게 된다. 정말 null 인 경우엔 표현식 자체가 null로 평가되어 더이상 작업을 수행하지 않아서 문제 없다.
movieTitle 이란 변수에 그 값을 저장한다면 movieTitle의 타입은 bestMovie?.title의 값이 null일 수도 있으니 String? 이다.
Safe Call은 한 코드문장? 안에서 한 번만이 아닌 여러번 사용될 수도 있다. 이번에 최고의 영화의 제목이 아니라 영화의 주연배우의 이름을 참조한다고 생각해보자.
보면 ?.를 한번만 쓸 경우 에러가 보인다 왜 여기서 ?.를 한번 더 붙여줘야 하는 걸까?
1) bestMovie가 실제 Movie 개체를 참조하고 있는 경우
=> bestMovie가 참조 가능한 실제 어떤 Movie 개체가 있다고 하자. 이 Movie 객체는 Actor 객체를 참조하며, 이 Actor 객체의 속성에도 참조가 가능하다. 모든 객체가 존재할 경우 아무 문제없이 모두 다 잘 작동된다.
2) 아직 참조 가능한 Movie 개체가 없다면?
=> 이 경우 bestMovie는 null을 참조하게 된다. 이에 따라 첫번째 bestMovie?.mainActor 는 null이다. 즉 이 bestMocie?.mainActor 가 실제 객체를 참조하고 있는지 확인이 된 후 firstName 속성에 참조할수 있게 해야 하니 mainActor 뒤에도 smart call을 붙이는 것이다.
아직 없는 영화는 배우가 존재하지 않는다. 배우가 존재하지 않으면 그 배우의 성씨도 존재하지 않는 것이다. 따라서 전체 표현식은 null이 되는 것.
출처:
내용 / 도움준 곳: 학교 교수님 (Christian Kohls) 강의
'언어 > Kotlin' 카테고리의 다른 글
Kotlin : null 이란? (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 |