삽질의 현장/- .NET

#065_닷넷(.NET)_.Net Framework 기본 - LINQ의 역할 (기본형) 2

shovelman 2015. 11. 6. 19:27


안녕하세요 삽잡이입니다.


이번 시간에는 LINQ 쿼리를 가지고 놀 때

기본형식으로 가지고 노는 경우에 대해서 지난시간에 이어 설명해보려고합니다.


LINQ에도 확장 메서드가 사용되고 있다는 사실을 아십니까?

사실, 확장 메서드는 IEnumerable<T> 형식의 인터페이스에 만들어져 있습니다.



따라서, LINQ를 동작시키는 모든 형식은 

IEnumerable<T>의 수 많은 기능을 사용할 수 있습니다.

즉, IEnumerable<T>를 구현한 녀석이라면 모두 다 확장 메서드를 사용할 수 있다 이겁니다.


어마어마하죠? 아무튼...


LINQ는 두가지로 실행할 수 있다는 사실을 아십니까?

바로, '즉시 실행'과 '지연 실행'입니다.

즉시 실행의 경우 LINQ 쿼리를 때렸을 경우 '지금' 동작이 수행되는 것이고,


지연 실행은 LINQ 쿼리가 쓰여있는 곳에서 실제 쿼리를 날리지 않고,

데이터가 필요한 시점에 쿼리를 날리는 것입니다.

즉, 쿼리문을 때려도 나중에 사용되게 된다 이겁니다.


기본적으로 LINQ는 지연 실행을 합니다.

코드를 작성해두고, 실제 필요한 시점에 쿼리를 실행한다는 것입니다.

이를 통해 항상 최신 데이터로 작업을 할 수 있다는 장점이 있습니다.

만약, 미리 쿼리문을 날렸더라면 데이터가 최신화 되던 말던 

이전 쿼리문을 때렸던 데이터를 기준으로 결과가 나올 것입니다.


그렇다면 즉시 실행은 언제하게 될까요?

LINQ 쿼리의 결과를 외부에 명확한 타입으로 전다랗고자 할 때 사용합니다.

이때 스냅샷을 얻는다고 하는데,

이 스냅샷은 '잠깐동안의 데이터 집합'을 의미합니다.



해당 예제에서는 array 형식으로 반환하도록 만들었습니다.

방금 작성한 쿼리문을 즉시 실행시키는 것입니다.


우리는 결과 집합으로 명확히 IEnumerable<T> 형식을 얻을 수 있습니다.

그런데, 이 인터페이스를 반환하기 위해서는 진짜 객체가 있어야합니다.

이 객체가 바로 Enumerable 형식인 것입니다.


쿼리를 날려 얻은 결과치를 반환하고 싶을 때에는 어떻게 해야할까요?

위의 예시에서 보여주듯,

Enumerable타입의 int[] 형식의 집합으로 저장을 했습니다.

따라서 반환을 할 수 있게 되지요.

왜 var 타입은 안될까요?

당연하게도 var 타입은 매개변수를 포함한 지역변수 외에는 사용을 할 수 없기 때문입니다.


이를 적용하게 된다면,

LINQ의 쿼리 결과를 반환할 때에 외부로 return 시키고 싶다면

return IEnumerable<명확한 형식>을 반환하면 됩니다.

또한 확장 메서드를 사용해서 var 형식을 변환하고 

해당 형식으로 return 시켜도 됩니다.

이유는 아시다시피 var는 사용할 수 없기 때문입니다.


이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!