[ C# ] Lazy class와 Singleton

Lutica_·2024년 7월 21일

Lazy class

정식 문서 :
https://learn.microsoft.com/ko-kr/dotnet/framework/performance/lazy-initialization

Lazy class란?

  • 개체를 처음 사용할 때 까지 초기화하지 않는 class.
  • 아무 설정을 하지 않으면 Thread-safe하다.
  • 사용 방식은 아래와 같다.
// 정의
public class Lazy<T>
Lazy<T>()	
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 대상 형식의 매개 변수가 없는 생성자가 사용됩니다.

Lazy<T>(Boolean)	
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 대상 형식의 매개 변수가 없는 생성자와 지정된 초기화 모드가 사용됩니다.
// false일때 thread-safe가 사라진다. -> 값이 덮어 씌워질 수 있다.

Lazy<T>(Func<T>)	
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 지정된 초기화 함수가 사용됩니다.

Lazy<T>(Func<T>, Boolean)	
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 지정된 초기화 함수 및 초기화 모드가 사용됩니다.

Lazy<T>(Func<T>, LazyThreadSafetyMode)	
//지정된 초기화 함수 및 스레드 안전 모드를 사용하는 Lazy<T> 클래스의 새 인스턴스를 초기화합니다.

Lazy<T>(LazyThreadSafetyMode)	
//T 매개 변수가 없는 생성자 및 지정된 스레드 안전 모드를 사용하는 Lazy<T> 클래스의 새 인스턴스를 초기화합니다.

Lazy<T>(T)	
//미리 초기화된 지정된 값을 사용하는 Lazy<T> 클래스의 새 인스턴스를 초기화합니다.

// 실 사용
var Something = Lazy<T>();
var Something = Lazy<T>(()=>new T()); // 함수를 실행하며 초기화
...
  • 메소드는 아래와 같다.
IsValueCreated	
//이 Lazy<T> 인스턴스에 대해 값이 만들어졌는지 여부를 나타내는 값을 가져옵니다.

Value	
//현재 Lazy<T> 인스턴스의 지연 초기화 값을 가져옵니다.
  • 즉, 초기화된 값을 보고싶다면 .Value를 붙혀야 한다.

Thread-safe의 의미 (초기화 모드에 대해)

  • 아무 설정을 하지 않는다면, 다른 Thread에서 접근하더라도 단 한번 초기화된다.
  • 즉, mutex설정 등이 없더라도 무사히 진행된다는 뜻이다.
  • 만약 초기화 옵션에서 false / None를 준다면, 다른 스레드에서 여러번 실행될 수도 있으니 주의해야 한다.
  • LazyThreadSafetyMode 를 통해 설정하는 경우, PublicationOnly를 쓰게 되면 객체는 단 하나 생성되지만 초기화는 여러번 시도될 수 있음.

Singleton과 같이 쓰기

  • Thread-safe 하므로, Memory상에서 단 하나의 객체만 존재해야 하는 Singleton 패턴에서 유용하게 활용될 수 있다.
  • 이하의 방식으로 초기화 하면 싱글턴과 같은 패턴으로 초기화된다.
    private static readonly Lazy<ScheduleDatabase> _instance = new (() => new ScheduleDatabase()); // 바로 초기화 
    public static ScheduleDatabase Instance { get=> _instance.Value };
profile
해보고 싶고, 하고 싶은 걸 하는 사람

0개의 댓글