- LINQ란?
- C#에서 데이터를 쿼리하고 조작할 때 루프나 조건문 등 복잡한 논리리문을 작성해야 할 때 작업을 간소화시켜주는 LINQ(Language-Intergrated Query)라는 기능을 제공한다.
- LINQ는 다양한 데이터 소스를 쿼리하고 조작하기 방법을 제공하는 C#의 언어 확장 집합
- LINQ를 사용하여 SQL 유사 구문 또는 메서드 접근 방식을 사용하여 개체, 컬렉션, 데이터베이스 XML등을 쿼리 할 수 있다.
- LINQ의 장점
- 가독성과 표현력 : LINQ는 복잡한 데이터 작업을 간결하고 선언적인 방시긍로 펴한할 수 있도록 코드를 단순화하고 가독성을 향상 시킴
- 타임 안정성 및 컴파일 검사 : LINQ의 중요한 장점 중 하나는 C# 유형 시스템과의 통합하는 것
ㄴ 컴파일 타입 검사를 통해 쿼리가 유효하고 안전한 형식인지 확인할 수 있다.
- 코드 재사용성 : LINQ를 사용하면 쿼리를 한번 작성하여 재사용이 가능
- LIQN의 단점
코드
기본 구조
var query = from item in source
where condition
select projection;
LIQN 예시
int[] numbers = { 2, 4, 6, 8, 10 };
// 짝수만 선택
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
foreach (int number in evenNumbers)
{
Console.WriteLine(number);
}
- 위 예시에서 실제 연산은 foreach문에서 하기 때문에 지연로딩이 발생한다.
ㄴ 여러개의 LINQ 메소들을 결합한 결과를 여러번 조회(foreach)하게 되면 그때그때 마다 결합된 메소드 만큼의 수행을 다시 하게된다 => 속도가 느려진다.
ㄴ LINQ 메소드들는 내부적으로 yield를 사용하므로 조회가 소비하는 코드와 결합하게되는데, 전체 조회시간이 길어지면서 멀티스레드의 환경에서 대상(source)의 목록이 바뀌게 되면 예외가 발생하기가 쉬워진다.
- yield란?
ㄴ C#의 yield 키워드는 이터레이터(iterator)를 구현하는 데 사용되는 특별한 키워드로 이터레이터는 컬렉션의 요소를 하나씩 순차적으로 반환하는 객체를 의미하며, foreach 문과 함께 사용하여 컬렉션을 순회하게된다.
** yield가 무슨 말인지 이해가 안가 추가 정리
ㄴ 예를 들어 1~10까지 숫자를 출력할때 일반적인 메서드는 1,2,3,4,5,6,7,8,9,10을 처리해 한번에 출력하나
ㄴ yield는 1을 출력후 일시정지 했다 다음 반복에 이어서 시작해 2를 출력 후 일시정지 하는 과정이 발생하여 값이 많거나할때 느려진다.
메모리 사용 측면에서의 단점 정리
ㄴ 최신 C# 버전에서는 LINQ가 발달하여 성능이 향상되었다고는 하나, 여전히 잘못된 사용이나 잘못된 환경에서는 메모리 문제를 일으킬 수 있다.
ㄴ 즉 LINQ를 사용할때 여러번 호출하게 되면 매번 쿼리가 실행되면 힙 메모리 할당과 완료 후 해제를 하게되어 불필요한 GC의 호출이 잦아져 성능이 저하된다.