C# 3.0 에서 처음 소개된 언어 통합 질의 (LINQ, 링크) 는 IEnumerable<T> 인터페이스를 구현하는 컬렉션 등으로부터 필요한 데이터 원본을 쉽게 질의 할 수 있다.
LINQ는 컬렉션 데이터를 질의할 때 지연 실행 개념을 이용한다
var numbers = new List();
numbers.Add(1);
var r01 = numbers.Select(x => x * 10);
numbers.Add(2);
foreach (var x in r01)
{
Console.WriteLine(x);
}
위 결과는 10, 2가 아니라 -> 10, 20이 나온다
이유는 질의를 완성하고 나서 바로 시퀀스를 반환하는것이 아니라 foreach문에서 열거 작업이 실행될때 쿼리가 실행되는 지연 실행 때문이다.
지연 실행을 원하지 않고 바로 반환을 할수도 있다.
Count(), First(), ToList(), ToArray() 와 같은 메서드를 사용하면 개체를 반환하는 메서드이기 때문에 바로 실행이 된다.
플루언트 구문 : 람다식 형태의 매개변수, 확장 메서드에 따른 메서드 체인으로 작성하는 코드 방식
쿼리식 구문 : SQL 질의와 비슷하게 작성하는 코드 방식
컴파일러는 컴파일 과정에 쿼리식을 플루언트 구문으로 변환한다
쿼리식으로 표현한 것은 플루언트 구문으로도 작성이 가능하다.
함수형 프로그래밍에선 플루언트 구문이 최적의 방법이라고 할 수 있다? ( 플루언트 구문이 람다식, 메서드 체인 등을 이용한 코드 방식때문에 코드 수를 줄일 수 있다는 장점에서 현재 .보는 책에서는 언급이 된 거 같다)
Enumerable 클래스는 System.Linq 네임스페이스에 속해 있으며 50여개의 표준 질의 연산자를 포함한다.
필터링 : 조건을 만족하는 것들을 추출하기 위해 데이터 요소를 평가하는 작업
(Where, Take, Skip, TakeWhile, SkipWhile, Distinct)가 있다.
투영 : 개체를 다른 형태로 변환 하는 것
(Select, SelectMany)가 있다
조인 : 직접적인 객체 모델 관계를 갖지 않는 서로 다른 원본 시퀀스들을 하나의 출력 시퀀스로 짜맞추는 작업
(Join, GroupJoin)가 있다
정렬 : 기본 비교자를 이용해서 결과 시퀀스를 정렬하는 작업
(OrderBy, ThenBy)가 있다
그룹화 : TKey 키 값에 따라 그룹화된 IGrouping<Tkey, Telement> 형식의 개체들로 구성된 시퀀스를 생성한다.
(GroupBy, Group, by)가 있다
집합연산 : 동일 컬렉션 혹은 별도의 컬렉션 내에서 일치하는 요소의 존재 여부에 기반한 결과 집합을 반환한다.
(Concat, Union, Intersect, Except)가 있다
변환 메서드 : 컬렉션의 형식을 변한하기 위한 것
(OfType, Cast, ToArray, ToList, ToDictionary, ToLookup)가 있다
요소 연산 : 인덱스나 조건자를 이용해서 시퀀스가 포함하는 개별 요소를 추출하는 작업
(First, FirstOrDefault, Last, Single, SingleOrDefault, ElementAt, DefaultIfEmpty)가 있다
1. LINQ의 장점은 데이터를 다룰 때 필요한 연산을 한 곳에 묶을수 있다는 것인거 같다.
하지만 LINQ의 표현식을 사용해서 작업하다 보면 때로는 남용될 가능성은 없을까?
그렇다면 오히려 가독성이나, 코드 정리를 해칠수도 있지 않을까
이럴땐 오히려 간단한 메서드 호출이 더 짧고 가독성이 좋지 않을까
2. LINQ의 지연 실행의 장점은 질의를 한번 정의하고 나면 필요할 때만 별도로 호출 할 수 있기 때문에 이 장점을 잘 이용하면 메모리 부하가 적고 자원 낭비가 덜한 코드를 작성할 수 있다는 것이다.
하지만 (Avarage, Count)등, 몇몇 연산자 (orderBy, Reverse)등과 같은 질의 연산자들은 원본 시퀀스를 반복하기 때문에
메모리 효율을 저하시킬수 있어서 이러한 점을 인지하고 사용하는게 좋다고 한다.
3. 성능에선 어떤게 좋을까?
StackOverFlow에서 보면 LINQ같은 경우엔 개발적인 속도와, 유지 보수성에선 LINQ에 손을 들어주는 대신
성능을 우선시 해야할 경우엔 수동으로 코드를 작성해주는 것이 더 좋다라는 식에 의견이 많은 것 같다.
모든지 과하면 안좋은 것 처럼, 무작정 쓰지 말아야 한다! 라는것 보단 적절한 선에서 적절히 사용한다면 좋은 프로그램 작성과, 효율을 다 가져갈 수 있지 않을까? ( 너무 뻔한말인가..)
'C#' 카테고리의 다른 글
C# - 함수형 프로그래밍, 재귀 호출 (0) | 2021.07.23 |
---|---|
c# - 비동기 프로그래밍, 생각.. (0) | 2021.07.23 |
C# - 함수형 프로그래밍 확장 메서드 (0) | 2021.07.23 |
C# - 무명메서드 람다식 (0) | 2021.07.23 |
C# - 대리자 (delegate) (함수형 프로그래밍) (0) | 2021.07.23 |