본문 바로가기
Programming Language/Kotlin

Lazy Init - 기본

by YellowCow 2023. 10. 28.

배경

JPA에서 사용했었던 Lazy Init의 개념과 비슷하다

 

아래코드는 Java로 JPA를 사용할 때 Lazy Init을 사용한 예이다

게시글(Post)의 작성자(user)의 정보를 사용할 때

작성자(user)의 정보를 DB에서 Select 해와서 초기화 해준다 

public class Post{
    //...
    @ManyToOne(fetch = FetchType.LAZY)
    private User user;
    //...
}

 

변수를 사용할 때 변수의 값을 초기화 해주는 기법을 'Lazy Init'이라고 한다

 

JPA의 Lazy Init은 Java가 아닌 JPA에서 지원하는 것이지만,

코틀린에서는 Lazy Init을 언어차원에서 지원하고 있다

다만, Kotlin에서는 DB에서 값을 Select해서 가져온다기 보다는 변수 값 초기화 자체에 초점이 맞춰져 있다

 

 

문법

아래 코드에서 lazy 블럭 안의 구문들이 초기화 시 실행된다

val|var varName : T by lazy({Synchronization 옵션}){
	//초기화 구문
}

적용 예

아래는 적용 예이다

main 메서드에서 helloChatBot.sayHello()를 호출할 때

HelloChatBot 객체의 greeting이라는 멤버 변수에 접근하는 코드이다

greeting에 접근할 때 변수 값을 초기화 하고 있다

class HelloChatBot{
    val greeting: String by lazy { getHello()};

    fun sayHello() = println(greeting);
}

fun getHello() = "안녕하세요"

fun main(){
    val helloChatBot = HelloChatBot()

    helloChatBot.sayHello();
}

 

사용목적

  • 변수 사용시점에 값을 초기화하여 메모리를 절약
    • val 타입의 경우, 자바의 const 키워드와 비슷한데
      변수를 처음 사용할 때 값을 딱 1번 초기화 할 수 있도록 지원한다
  • 성능 향상
    • 위 적용 예에서 lazy init을 적용하지 않을 경우, 'greeting' 변수에 접근할 때마다 getHello()메서드가 실행될 것이다
      lazy init을 적용하면 변수가 사용될 때만 getHello()메서드가 호출되도록 할 수 있어 성능상 이점이 있다

'Programming Language > Kotlin' 카테고리의 다른 글

Late Init  (1) 2023.10.31
Lazy Init - Synchronization 옵션  (0) 2023.10.30
변성  (0) 2023.10.21

댓글