몰?.루();

왜 lateinit var에 원시 타입은 못 넣을까 본문

프로그래밍/안드로이드, 코틀린

왜 lateinit var에 원시 타입은 못 넣을까

toonraon 2023. 7. 12. 00:44
lateinit var a: String // 가능
lateinit var b: Int // 불가능
lateinit var c: Integer // 가능

왜냐하면 코틀린 코드를 자바로 변환했을 때 lateinit을 구현하는 방법 자체가 변수를 일단 null로 해놓고, getter를 호출하는 시점에 변수가 아직 null이면 Exception을 throw하는 방식이기 때문입니다.

 

그렇기 때문에 String 같은 non-primitive type들은 처음에 null을 일단 선언해놓을 수 있는데

int 같은 primitive type들은 처음에 null로 선언할 수가 없기 때문에 (자바에서 int형에 null을 넣을 수 없습니다. 멤버 변수 선언할 때 그냥 int a; 이렇게 선언만 해놓는 것도 결국엔 int a = 0;으로 처리됩니다. 절대 null이 못 들어갑니다.)

 

그렇기에 코틀린에서 lateinit var를 Int형에는 사용할 수 없는 것입니다.

대신 Integer형은 원시 타입이 아니라 참조형 타입이기 때문에 null을 참조할 수 있어서 lateinit이 가능합니다.

물론 Int형을 lateinit으로 하겠다고 억지로 Integer형으로 선언하는 것은 안 좋은 코딩 방법입니다. 차라리 그냥 var c = 0; 이런 식으로 하는 게 맞습니다.

 

참고: https://velog.io/@no1msh1217/Kotlin-lateinit-var%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC

Comments