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 |