Kotlin : nullable 타입 안전하게 참조하기 (ft.Safe Call)

언어/Kotlin

Kotlin : nullable 타입 안전하게 참조하기 (ft.Safe Call)

해리누나 2022. 11. 9. 05:09
반응형

 

아래 예시 코드를 보자.

물론 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) 강의

 

 

728x90
반응형