프로그래밍/C#

Lazy<T>

selinatsu 2024. 10. 14. 02:07
반응형

Lazy<T>는 .NET에서 제공하는 제네릭 클래스 중 하나로, 특정 객체를 필요할 때까지 생성하지 않고 미루는 "지연 초기화" (Lazy Initialization)를 지원하는 클래스입니다.

 

즉, 실제로 객체가 필요할 때 처음 한 번만 생성하고 그 이후에는 이미 생성된 객체를 사용하게 하는 방식입니다.

 

Lazy<T>의 주요 특징

지연 초기화:

객체 생성이 반드시 필요할 때까지 미루기 때문에 성능 최적화가 가능합니다.

 

스레드 안전성:

Lazy<T>는 기본적으로 스레드 안전하게 작동하여, 여러 스레드에서 동시에 접근하더라도 객체가 한 번만 생성됩니다.

 

싱글톤 구현에 유용:

한 번만 생성되어야 하는 객체를 효율적으로 관리할 수 있습니다.

 

 

Lazy<T> 사용 방법

public class MyClass
{
    // Lazy<T>를 사용하여 MyClass 인스턴스 생성
    private static Lazy<MyClass> lazyInstance = new Lazy<MyClass>(() => new MyClass());

    // 외부에서 접근할 수 있는 인스턴스
    public static MyClass Instance
    {
        get
        {
            return lazyInstance.Value; // 이때 인스턴스가 처음 생성됩니다.
        }
    }

    // private 생성자
    private MyClass()
    {
        Console.WriteLine("MyClass 인스턴스가 생성되었습니다.");
    }

    public void DoSomething()
    {
        Console.WriteLine("MyClass 인스턴스의 메서드가 호출되었습니다.");
    }
}

 

 

사용 예시

class Program
{
    static void Main(string[] args)
    {
        // 아직 MyClass 인스턴스가 생성되지 않음

        // 처음으로 Instance에 접근할 때 MyClass 인스턴스가 생성됨
        MyClass instance = MyClass.Instance;
        instance.DoSomething();

        // 이후 Instance에 접근할 때는 이미 생성된 인스턴스를 사용
        MyClass anotherInstance = MyClass.Instance;
        anotherInstance.DoSomething();
    }
}

 

출력 결과

MyClass 인스턴스가 생성되었습니다.

MyClass 인스턴스의 메서드가 호출되었습니다.
MyClass 인스턴스의 메서드가 호출되었습니다.

 

 

주요 포인트

* Lazy<T>는 실제로 객체가 필요할 때 (lazyInstance.Value에 처음 접근할 때) 객체를 생성합니다.

* 이 과정은 기본적으로 스레드 안전하며, 여러 스레드에서 동시에 접근해도 객체가 중복 생성되지 않습니다.

* 이를 통해 불필요한 리소스 낭비를 막고, 성능 최적화를 도모할 수 있습니다.

 

 

Lazy Initialization이 필요한 경우

* 객체의 생성이 무겁고, 애플리케이션 전체 실행 동안 사용할 가능성이 낮은 경우.

* 다수의 스레드에서 동일한 객체를 동시에 생성하지 않도록 하고 싶을 때.

* 특히 싱글톤 패턴과 함께 사용하면 효율적으로 하나의 객체만 생성되고 관리될 수 있습니다.

 

간단히 말해 Lazy<T>는 객체 생성의 시점을 제어하여 성능을 최적화하고, 스레드 안전성을 제공하는 유용한 도구입니다.

 

 

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

클로저 (Closure)  (0) 2024.10.19
Lazy<T> 에 대한 조금 더 깊이있는 이해  (1) 2024.10.14
싱글톤 (Singleton)  (1) 2024.10.14
static 선언  (0) 2024.10.13
event 그리고 delegate, Action  (0) 2024.10.12