Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241108 Lazy 본문

Kotlin

[TIL]20241108 Lazy

최밤빵 2024. 11. 8. 20:36

Lazy Evaluation과 lazy 키워드로 지연 초기화를 활용하는 방법은 프로그램의 성능을 최적화하고 코드의 효율성을 높이기 위해 필수적인 기술이다.

 

▶Lazy Evaluation이란?

Lazy Evaluation은 필요한 시점까지 계산을 미루는 기법이다. 이는 프로그램이 불필요한 계산을 피하도록 도와주어, 메모리 사용량을 줄이고 성능을 향상시킨다. 예를 들어, 특정 변수가 프로그램 실행 중에 필요하지 않다면, 해당 변수의 초기화 작업을 지연시켜 자원을 절약할 수 있다.


▶lazy 키워드

lazy 키워드를 사용하여 변수를 지연 초기화할 수 있다. lazy 키워드를 사용하면, 변수가 최초로 사용될 때 초기화된다. 이를 통해 초기화 비용을 필요할 때까지 미룰 수 있어 프로그램 시작 시의 부하를 줄일 수 있다. 

val myValue: String by lazy {
    println("myValue가 초기화됩니다.")
    "Hello, Kotlin!"
}

fun main() {
    println("프로그램 시작")
    println(myValue) // 여기서 myValue가 처음으로 초기화됨
    println(myValue) // 이미 초기화된 값 사용
}

→ 이 코드를 실행하면 myValueprintln(myValue)가 호출될 때 비로소 초기화된다. 따라서 "myValue가 초기화됩니다."라는 메시지는 myValue를 처음 사용할 때 출력된다.


▶lazy의 장점

메모리 효율성

초기화가 꼭 필요할 때까지 미루기 때문에 메모리를 효율적으로 사용할 수 있다.

성능 최적화

초기화가 필요하지 않은 경우 불필요한 계산을 하지 않으므로 애플리케이션의 시작 속도를 개선할 수 있다.

스레드 안전성

기본적으로 lazy는 스레드 안전하게 동작한다. 즉, 여러 스레드에서 동일한 lazy 변수에 접근해도 한 번만 초기화된다.


▶싱글톤 패턴과 lazy

lazy 키워드는 싱글톤 패턴과 함께 사용될 때 특히 유용하다. 싱글톤 객체는 프로그램 전체에서 하나의 인스턴스만 존재해야 하고, 초기화 시점을 안전하게 제어할 필요가 있다. 

object Singleton {
    val data: String by lazy {
        println("Singleton data 초기화")
        "Singleton Data"
    }
}

fun main() {
    println("프로그램 실행")
    println(Singleton.data) // 여기서 Singleton의 data가 초기화됨
    println(Singleton.data) // 이미 초기화된 값 사용
}

→ Singleton.data는 처음 호출될 때 초기화되며, 이후에는 초기화된 값만 반환된다. 이는 싱글톤의 초기화가 한 번만 이루어지고, 그 이후에는 동일한 객체를 안전하게 사용할 수 있음을 보장한다.


▶지연 초기화를 사용해야 하는 경우

리소스 집약적인 초기화

초기화에 많은 자원을 소모하는 객체가 있을 때, 해당 객체를 필요할 때까지 초기화하지 않으면 성능을 최적화할 수 있다.

지연된 로드

앱의 특정 기능이 선택적으로 사용될 경우, 해당 기능의 초기화를 지연시켜 초기 메모리 부담을 줄일 수 있다.


lazy 키워드는 코틀린에서 효율적인 초기화 관리에 큰 도움이 된다. Lazy Evaluation을 통해 초기화 시점을 제어하고, 필요할 때만 초기화하여 메모리와 성능을 최적화할 수 있다. 특히, 싱글톤 패턴과 함께 사용하면 안전한 초기화를 보장할 수 있어 코드의 안정성과 효율성을 높일 수 있다. 이러한 장점을 잘 활용하면 보다 최적화된 코드를 작성할 수 있다.

'Kotlin' 카테고리의 다른 글

[TIL]20241110 커링(Currying)  (0) 2024.11.10
[TIL]20241109 sealed interface  (0) 2024.11.09
[TIL]20241107 실드클래스(Sealed Class)  (1) 2024.11.07
[TIL]20241106 제네릭(Generic)  (1) 2024.11.06
[TIL]20241105 Label & break/continue  (1) 2024.11.05