티스토리 뷰

Server

Kotlin의 lateinit과 Nullable (2)

니용 2020. 6. 30. 12:13
반응형

Author: 니용

 


초기화 지연

Kotlin에서는 런타임에서 작동할 때 초기화의 우선순위를 뒤로하여 초기화해주는 방법이 존재합니다. 

이를 lateinit 키워드 또는 by lazy를 사용하여 작성할 수 있습니다. 왜 사용할까요? 

초기화를 늦추게 되면 프로젝트가 부팅되면서 메모리에 우리가 작성한 소스코드가 적재(load)됩니다. 이 과정에서 모든 데이터를 올리게 되면 아무래도 사용하지 않는 데이터가 있을 것인데 같이 올라가게 되다 보니 성능에 지연이 발생할 수 있습니다. 이를 개선하기 위해서 특정 코드가 호출되었을 때 초기화를 할 수 있도록 지정해주기 위해 사용하는 방법입니다. 

 

키워드가 두 개인만큼 사용하는 방법에는 차이가 있습니다. 


Late initialization

 

lateinit을 사용하여 변수를 선언하는 것이 Late initialization입니다. 선언은 미리 되어 있고, 사용할 때 초기화가 이루어지게 됩니다. 초기화를 하지 않으면 Exception이 출력됩니다. 코드를 보겠습니다.

 

class Abbo {
   lateinit var member: Member // 초기화 안함
   
   // 초기화 함수
   fun initMember(param: Member) {
      this.member = param
   }
}

class Member(val memberId: Int)

fun main() {
   val niyo = Abbo()
   niyo.initMember(Member(1)) // 초기화 안하면 아랫줄에서 UninitializedPropertyAccessException 발생!
   print(niyo.member.memberId)
}

여기에서는 Abbo 클래스 내 member 변수에 초기화를 하지 않았고, nullable이 아니기 때문에 초기값을 할당하지 않으면 에러가 납니다. lateinit을 활용해 나중에 사용 시 초기화를 하겠다고 하여 Compile Error가 발생하지 않습니다.

그리고 Member 클래스가 호출되고 initMember 함수를 호출하지 않으면 Exception이 출력되게 되죠. 

 

lateinit을 사용하는데는 제약조건이 있습니다. var에만 사용 가능하며, primitive type에는 사용이 불가능합니다. 

val을 사용하거나 Int등을 사용하면 Compile Error 납니다.

그리고 custom getter/setter 사용이 불가능하고 Nullable property는 사용이 불가능합니다. 

lateinit val member: Member
lateinit var memberId: Int
lateinit var member: Member?
lateinit var member: Member
   get() { member; }
   

위의 경우는 모두 컴파일 에러가 발생합니다.

 


Lazy Initialization

 

lazy는 late와는 살짝 다릅니다. 선언부에서 초기화 코드가 정의되고, 자동으로 초기화 코드를 동작합니다.

사용 방법은 기존에 썼던 방법과 크게 다르지 않습니다. 

 

class Abbo() {
   val make: String by lazy {
      print("init complete")
      "Success"
   }
}

fun main() {
   val niyo = Abbo()
   println(niyo.make)
   print(niyo.make)
}

위와 같은 코드가 있다고 하면 콘솔은 출력이 어떻게 될까요?

초기화는 한 번만 되기 때문에 이렇게 출력될 것입니다.

Init complete
Success
Success

Lazy initialization의 특징은 lateinit과 다르게 val이 사용 가능하고, primitive type도 사용 가능합니다. 또, nullable에 관계없이 모두 사용 가능합니다.

 

반응형

'Server' 카테고리의 다른 글

Kotlin의 Type과 Nullable (3)  (0) 2020.07.01
[Kotlin] MongoDB JPA 사용하기  (2) 2020.06.30
MongoDB 설치하기  (0) 2020.06.30
Kotlin의 생성자와 data class  (0) 2020.06.29
Kotlin의 Any와 Nullable (1)  (0) 2020.06.29
Kotlin의 Control Flow  (0) 2020.06.26
댓글
공지사항