더북(TheBook)

2.1.3 지연 초기화 이해하기

참조 초기화를 늦추기 위해 var를 사용할 수밖에 없지만, 일단 참조를 초기화해 값이 정해진 다음부터는 변경을 막고 싶을 때가 있다. 초기화를 늦게 해야 하는 이유는 많다. 가장 흔한 경우는 초기화에 비용이 많이 들어서 참조를 실제로 사용하기 전까지 절대 초기화하고 싶지 않은 경우다.

일반적인 해법은 var 참조를 null로 초기화하고 나중에 의미 있는 값을 대입하는 것이다. 이렇게 바꾼 값은 이제 거의 바뀌지 않는다. 하지만 코틀린은 널이 될 수 있는 타입(nullable type)과 널이 될 수 없는 타입(non-nullable type)을 구분하므로 이런 식으로 참조를 사용하기는 힘들다. 널이 될 수 없는 타입은 NullPointerException이 발생할 위험이 없기 때문에 훨씬 안전하다. 필드 선언 시점에는 값을 알지 못하지만, 일단 초기화되고 나면 절대 바뀌지 않는 값이 있다. 이때 어쩔 수 없이 var를 사용해야 된다면 슬픈 일이다. 이런 경우 다음처럼 널이 될 수 없는 참조 대신 널이 될 수 있는 참조를 써야 한다.

var name: String? = null
...
name = getName()

여기서 name이라는 참조의 타입은 String?인데, 이 타입은 널이 될 수 있는 타입이다. 이 참조의 타입을 String으로 하면 어떨까 하고 생각할 수도 있겠지만, 실제로는 그럴 수 없다. 널이 될 수 없는 String 타입을 사용하려면 다음과 같이 초기화되지 않은 참조임을 나타내는 특별한 문자열을 사용해야 한다.

var name: String = "초기화_안_됨"
...
name = getName()
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.