In to the C# 2014. 1. 20. 18:03

Lazy Initialization

Lazy initialization.

게으른 초기화.

 

네. 초기화를 뒤늣게 하는 것입니다.

가령 인스턴스를 만들 때 인스턴스 멤버들이 초기화 되는데 이 멤버들을 필요한 시점에 초기화 하는 것입니다.

 

Q. 언제 사용하기 위해 이런 개념이 생겨난걸까요?

A. 필드가 많은 경우 사용되지 않는 상황이나 초기화를 빨리하고 부가 작업을 뒤로 미루고 싶을 때 적합합니다.

 

Q. 그럼 언제 사용하지 않는게 좋을까요?

A. 최적화를 통해 성능 저하를 해결해야 하는 상황이 아니라면 초기화의 지연을 사용하지 않아야 합니다. 어떤 경우에는 이런 기법이 디버깅을 어렵게 만듭니다.

 

위 소스 예제는 C#에서의 Lazy 클래스를 설명해줍니다.

 

Line 17과 같이 객체를 생성하여도 LazyList는 값이 생성되지 않은 상태 입니다.

Line 19와 같이 값을 참조 하기만 하여도 LazyList는 생성이 됩니다. Lazy 객체의 Value는 읽기 전용이라 바로 값을 쓰지 못합니다. 소스와 같이 값을 참조한 다음에 활용하여야 합니다.

 

Line 25와 같이 Test 객체에 List가 채워진걸 보실 수 있습니다.

 

이 Lazy객체는 생각보다 빠르지 않습니다. 퍼포먼스가 떨어집니다. 그러므로 가능한 사용하지 않고, 첫번째 질문처럼 해당 사항이 발생하지 않을 때에는 사용하지 않는 편이 좋습니다.

 

C#에서 Lazy initialization의 대표적인게 LINQ에서 사용이 되는데요. LINQ에 대해 제대로 모르면 심각하게 삽질을 할 수 있는 경우가 생깁니다.

아래 소스를 먼저 보시겠습니다.

 

 

위 소스를 보시면 Line 15는 MyList의 요소를 꺼내요 factor를 곱한 뒤 selected에 넣는 그런 내용입니다.

그런데 Line 17에서 factor를 20으로 변경해주었군요.

 

Line 21에서 linq의 결과물을 프린트 하고 있습니다.

결과는 아래..

 

 

 

네. 의도한 바와 같이 10이 곱해진게 아니라 20이 곱해졌습니다.

위의 코드에선 정확히 selected.ToList()를 할 때, 결과가 정해지게 되어 있습니다.

 

이런 점을 유의 하여 코드를 작성할 수 있도록 해야 합니다.

 

끝~

'In to the C#' 카테고리의 다른 글

[C#] Action, Func 그리고 Task  (0) 2014.01.26
[C#] Attribute : 속성  (0) 2014.01.24
BookSleeve - Pipelined .NET bindings for redis  (0) 2014.01.17
Delegates와 Serialization  (0) 2014.01.17
Dispose in C#  (0) 2014.01.14