본문 바로가기

C#

C# LINQ (Language Integrated Query) 완벽 가이드

반응형

LINQ란 무엇인가?

C#을 사용하는 개발자라면 한 번쯤은 접했거나 사용해본 적이 있을 LINQ (Language Integrated Query). LINQ는 C# 언어에 내장된 강력한 데이터 쿼리 기능으로, 데이터베이스, 컬렉션, XML, JSON 등 다양한 데이터 소스에 대해 일관된 방식으로 쿼리와 조작을 할 수 있게 해줍니다.

이 글에서는 LINQ의 기본 개념부터 실전 활용법까지 상세히 설명하며, 왜 C# 개발자에게 필수적인 기능인지 알아보겠습니다.

1. LINQ의 핵심 개념

1-1. 선언적 프로그래밍

LINQ는 선언적 프로그래밍 방식을 채택하고 있습니다. 즉, "어떻게" 수행하는지보다 "무엇을" 수행할지에 집중하는 방식입니다. 예를 들어, 컬렉션에서 특정 조건을 만족하는 데이터를 찾는 작업을 LINQ로 간단히 표현할 수 있습니다.

 

1-2. 쿼리 문법과 메서드 체인1-1. 선언적 프로그래밍

LINQ는 두 가지 문법을 지원합니다

 

  • 쿼리 문법 (Query Syntax): SQL과 유사한 문법
  • 메서드 체인 (Method Syntax): 람다식을 활용하는 방식

둘 다 동일한 기능을 수행하며, 상황에 따라 선택적으로 사용됩니다.

 

2. LINQ의 기본 사용법

2-1. 컬렉션에 대한 LINQ 쿼리

 

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        // LINQ 쿼리 문법
        var evenNumbers = from num in numbers
                          where num % 2 == 0
                          select num;

        Console.WriteLine("짝수 목록:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}

 

 

이 예제는 리스트에서 짝수만 필터링하는 간단한 예제입니다.

 

3. LINQ의 실전 활용 예제

3-1. 데이터 필터링과 정렬

var filteredSorted = numbers
    .Where(n => n > 3)
    .OrderByDescending(n => n);

 

이 코드는 4 이상인 숫자를 내림차순으로 정렬하는 예제입니다.

 

3-2. 객체 컬렉션에서 특정 속성 추출

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

List<Person> people = new List<Person>
{
    new Person { Name = "홍길동", Age = 30 },
    new Person { Name = "이순신", Age = 45 },
    new Person { Name = "유관순", Age = 20 }
};

var names = from person in people
            where person.Age >= 30
            select person.Name;

foreach (var name in names)
{
    Console.WriteLine(name);
}

 

이 예제는 30세 이상인 사람들의 이름만 추출하는 방법입니다.

 

4. LINQ의 고급 기능

4-1. 그룹화 (GroupBy)

var groupedByAge = people.GroupBy(p => p.Age / 10 * 10);

foreach (var group in groupedByAge)
{
    Console.WriteLine($"{group.Key}대:");
    foreach (var person in group)
    {
        Console.WriteLine($" - {person.Name}");
    }
}

 

이 코드는 나이대를 기준으로 그룹화하는 예제입니다.

4-2. 집계 함수 (Sum, Average, Max, Min)

int totalAge = people.Sum(p => p.Age);
double averageAge = people.Average(p => p.Age);
int maxAge = people.Max(p => p.Age);
int minAge = people.Min(p => p.Age);

 

이 함수들은 컬렉션의 데이터를 빠르게 분석하는 데 유용합니다.

5. LINQ 사용 시 유의사항

  • 성능 고려: LINQ는 편리하지만, 대용량 데이터에서는 성능 저하가 발생할 수 있습니다. 필요시에는 적절한 인덱스와 최적화를 고려하세요.
  • 즉시 실행 vs 지연 실행: LINQ 쿼리는 기본적으로 지연 실행(lazy evaluation)입니다. 즉, 쿼리 결과를 사용할 때 실제 데이터가 처리됩니다. ToList() 또는 ToArray()를 사용하면 즉시 실행됩니다.

 

반응형