728x90

🏆 목차.

  1. 서론
  2. 본론
  3. 결론

 

🛒 서론

LINQ(Language Integrated Query)는 Microsoft에서 도입한, NET 언어에 통합된 쿼리 구문입니다.

LINQ를 사용하면 데이터베이스, XML, 컬렉션 등의 다양한 데이터 소스를 일관된 방식으로 쿼리 할 수 있습니다.

이와 같이 LINQ는 데이터를 쿼리하고 조작하는 과정을 매우 쉽게 만들어줍니다.

이번 글에서는 LINQ의 개념, 기능, 장점과 단점등에 대해 알아보겠습니다.

 

🎨 본론

 

LINQ의 사용방법 및 활용 예시

 

1. LINQ To Objects

List<UnitData> unitList;
private UnitData GetUnitData(int unitID)
{
    unitList = UserInfo.GetUnitListData();
    var unit = unitList.Where(_ => _.UnitID == unitID);
}

 

위 코드는 메모리에 있는 컬렉션을 쿼리 하는 코드입니다. 다음과 같은 방식으로 리스트나 배열과 같은 컬렉션에 대해 간단한 쿼리를 작성할 수 있습니다.

코드를 설명하자면 모든 유닛에 대한 리스트중에서 내가 원하는 ID를 가진 유닛을 찾는 코드입니다.

2. LINQ to SQL

var dbContext = new MyDbContext();
var query = from item in dbContext.Items
            where item.name == "대검"
            select item;

 

위 코드는 SQL 데이터베이스를 쿼리하는 코드입니다

SQL 쿼리를 C# 코드로 작성하여 데이터베이스와 상호작용할 수 있습니다.

3. LINQ to XML

var xml = XDocument.Load("example.xml");
var items = from item in xml.Descendants("Item")
            where (int)item.Element("Price") > 100
            select item;

 

위 코드는 XML 데이터를 쿼리하고 조작하는 기능입니다.

XML 문서를 쉽게 탐색하고 수정할 수 있습니다.

 

LINQ의 장점

  1. 가독성 향상: 데이터를 처리하는 코드를 SQL과 유사한 형식으로 작성할 수 있어 가독성이 높습니다. 그 예시로 위 활용 예시의 2번 및 3번 모두 유사한 형식으로 사용되는 것을 알 수 있습니다.
  2. 일관성: 가독성 향상과 마친가지로 개발자는 일관된 방식으로 코드를 작성할 수 있습니다.
  3. 형 안전성: 컴파일 시점에 데이터 형식을 체크하여 타입 안전성을 보장합니다. 결과적으로 런타임 오류를 줄이고, 더 안정적인 코드를 작성할 수 있습니다.
  4. 지연 실행: 기본적으로 지연 실행되므로, 필요할 때만 데이터를 평가하여 성능을 최적화할 수 있습니다.

*지연 실행이란?

var query = myCollection.Where(x => x.IsActive);

// 실제로 쿼리가 실행되는 시점
var result = query.ToList();

 

 

위 코드에서 query를 선언하자마자 초기화를 하고있는것처럼 보이지만 사실 해당 코드(1번째 줄)는 실제 데이터를 포함하고 있는 게 아니라, 데이터를 어떻게 처리할지에 대한 설명(쿼리)을 담고 있는 것입니다.

 

var result = query.ToList();를 호출하면 비로소 쿼리가 실행되어 myCollection에서 x.IsActive 조건을 만족하는 요소들을 평가하고, 그 결과를 리스트로 반환합니다.

 

이과 같은 과정을 지연 실행이라고 합니다.,

 

LINQ의 단점


  1. 성능 오버헤드: 지연 실행과 메모리 할당 등으로 인해 성능 오버헤드가 발생할 수 있습니다.
  2. 메모리 사용량 증가: 새로운 컬렉션을 생성하기 때문에 메모리 사용량이 증가합니다. 특히 ToList(), ToArray()와 같은 메서드는 원본 데이터를 복사하여 새로운 리스트나 배열을 생성합니다.
  3. 디버깅 어려움: LINQ 쿼리는 체인 방식으로 메서드를 호출하므로, 디버깅 과정에서 원인을 추적하기 어려울 수 있습니다. 복잡한 쿼리는 가독성을 떨어뜨릴 수 있습니다.

성능 오버헤드 및 메모리 사용량에 대한 예시로 

List<int> numbers = Enumerable.Range(1, 1000000).ToList();

// LINQ 쿼리를 반복적으로 실행
for (int i = 0; i < 100; i++)
{
    var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
}

 

매 반복마다 전체 리스트를 순회하여 짝수를 필터링하기 때문에 이런 코드는 성능 오버헤드를 발생시키게 됩니다.

또한 ToList를 이용해 원본 데이터를 복사하여 새로운 리스트나 배열을 생성하기 때문에 이 경우 메모리 사용량이 증가하게 됩니다.

 

 

🎯 결론

 

LINQ는 가독성, 일관성, 형 안전성, 지연 실행 등의 장점을 제공하지만, 성능 오버헤드와 디버깅의 어려움 등 단점도 존재합니다. LINQ를 적절히 활용하면 코드의 유지보수성과 효율성을 크게 향상시킬 수 있습니다.

728x90

'프로그래밍 > C#' 카테고리의 다른 글

[C#] 추상 클래스와 인터페이스 비교  (0) 2024.06.12
[C# 8.0] switch 식  (0) 2024.02.08
[C# 8.0] Null 병합 할당 연산자 ??=  (0) 2024.02.07
[C#] 가변길이 매개변수 : params  (0) 2023.11.10
[C#] 박싱과 언박싱  (0) 2023.11.09

+ Recent posts