배경
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번 초기화 할 수 있도록 지원한다
- val 타입의 경우, 자바의 const 키워드와 비슷한데
- 성능 향상
- 위 적용 예에서 lazy init을 적용하지 않을 경우, 'greeting' 변수에 접근할 때마다 getHello()메서드가 실행될 것이다
lazy init을 적용하면 변수가 사용될 때만 getHello()메서드가 호출되도록 할 수 있어 성능상 이점이 있다
- 위 적용 예에서 lazy init을 적용하지 않을 경우, 'greeting' 변수에 접근할 때마다 getHello()메서드가 실행될 것이다
'Programming Language > Kotlin' 카테고리의 다른 글
Late Init (1) | 2023.10.31 |
---|---|
Lazy Init - Synchronization 옵션 (0) | 2023.10.30 |
변성 (0) | 2023.10.21 |
댓글