본문 바로가기
C#

C# LINQ: 데이터 쿼리를 간결하고 강력하게 다루는 방법

by 공부봇 2025. 1. 13.
반응형

LINQ (Language-Integrated Query)란?

**LINQ (Language-Integrated Query)**는 C#에서 제공하는 강력한 데이터 쿼리 기능입니다.
SQL과 유사한 방식으로 데이터를 검색, 필터링, 정렬, 변환할 수 있도록 도와줍니다.
LINQ는 데이터를 처리하는 방식을 간결하게 표현할 수 있어, 컬렉션, XML, 데이터베이스 등 다양한 데이터 소스에서 사용됩니다.


LINQ의 핵심 개념

  1. 컬렉션과 데이터 쿼리
    LINQ는 배열, 리스트, 데이터베이스 등에서 데이터를 쿼리할 수 있는 기능을 제공합니다.
  2. 표현식 기반
    SQL처럼 데이터를 처리하는 쿼리를 간단한 표현식으로 작성할 수 있습니다.
  3. 타입 안전
    LINQ는 컴파일 시점에 오류를 검출할 수 있어 안전한 코드를 작성할 수 있습니다.

LINQ를 왜 사용하나?

  1. 가독성
    복잡한 데이터 처리 로직을 간단한 쿼리 문법으로 표현할 수 있습니다.
  2. 일관성
    다양한 데이터 소스(컬렉션, XML, 데이터베이스 등)를 동일한 방식으로 처리할 수 있습니다.
  3. 유지보수성
    명확한 문법 덕분에 코드의 유지보수가 쉬워집니다.

LINQ의 기본 사용법

기본 예제: 배열에서 짝수 필터링

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5, 6 };

        // LINQ 쿼리를 사용하여 짝수만 필터링
        var evenNumbers = numbers.Where(n => n % 2 == 0);

        foreach (var number in evenNumbers)
        {
            Console.WriteLine(number); // 출력: 2, 4, 6
        }
    }
}

LINQ의 주요 메서드

  1. Where
    특정 조건에 맞는 데이터를 필터링합니다.
  2. var filtered = list.Where(x => x > 10);
  3. Select
    데이터를 변환합니다.
  4. var squared = list.Select(x => x * x);
  5. OrderBy / OrderByDescending
    데이터를 정렬합니다.
  6. var sorted = list.OrderBy(x => x);
  7. GroupBy
    데이터를 그룹화합니다.
  8. var grouped = list.GroupBy(x => x % 2 == 0 ? "짝수" : "홀수");
  9. Aggregate
    데이터를 누적하여 하나의 결과를 만듭니다.
  10. var sum = list.Aggregate((x, y) => x + y);

LINQ의 활용 상황

1. 컬렉션 데이터 처리

컬렉션(배열, 리스트 등)의 데이터를 손쉽게 처리할 때 사용됩니다.

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        string[] names = { "Alice", "Bob", "Charlie", "David" };

        // 'A'로 시작하는 이름 필터링
        var filteredNames = names.Where(name => name.StartsWith("A"));

        foreach (var name in filteredNames)
        {
            Console.WriteLine(name); // 출력: Alice
        }
    }
}

2. 데이터 정렬 및 변환

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 5, 3, 8, 1 };

        // 정렬 후 각 숫자 제곱
        var result = numbers.OrderBy(n => n).Select(n => n * n);

        foreach (var n in result)
        {
            Console.WriteLine(n); // 출력: 1, 9, 25, 64
        }
    }
}

LINQ의 고급 사용법

1. 익명 객체와 Select

LINQ에서 익명 객체를 사용하면 다중 속성을 처리할 수 있습니다.

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var products = new[]
        {
            new { Name = "Apple", Price = 100 },
            new { Name = "Banana", Price = 50 },
            new { Name = "Cherry", Price = 75 }
        };

        var expensiveProducts = products
            .Where(p => p.Price > 60)
            .Select(p => new { p.Name, TaxedPrice = p.Price * 1.1 });

        foreach (var product in expensiveProducts)
        {
            Console.WriteLine($"Name: {product.Name}, Taxed Price: {product.TaxedPrice:F2}");
        }
    }
}

2. GroupBy와 Aggregation

데이터를 그룹화하고 요약 정보를 계산합니다.

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var scores = new[]
        {
            new { Name = "Alice", Score = 85 },
            new { Name = "Bob", Score = 95 },
            new { Name = "Charlie", Score = 85 },
            new { Name = "David", Score = 75 }
        };

        var groupedScores = scores.GroupBy(s => s.Score)
                                  .Select(g => new { Score = g.Key, Count = g.Count() });

        foreach (var group in groupedScores)
        {
            Console.WriteLine($"Score: {group.Score}, Count: {group.Count}");
        }
    }
}

3. Join을 활용한 데이터 병합

두 컬렉션을 병합하여 데이터를 연결합니다.

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var students = new[]
        {
            new { StudentId = 1, Name = "Alice" },
            new { StudentId = 2, Name = "Bob" }
        };

        var grades = new[]
        {
            new { StudentId = 1, Grade = "A" },
            new { StudentId = 2, Grade = "B" }
        };

        var studentGrades = students.Join(grades,
            student => student.StudentId,
            grade => grade.StudentId,
            (student, grade) => new { student.Name, grade.Grade });

        foreach (var student in studentGrades)
        {
            Console.WriteLine($"Name: {student.Name}, Grade: {student.Grade}");
        }
    }
}

4. Deferred Execution (지연 실행)

LINQ는 쿼리를 실행할 때 즉시 결과를 계산하지 않고, 데이터가 실제로 필요할 때 실행합니다.

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new int[] { 1, 2, 3, 4, 5 };

        var query = numbers.Where(n => n > 3);

        // 데이터 추가
        numbers[4] = 10;

        // 쿼리 실행
        foreach (var n in query)
        {
            Console.WriteLine(n); // 출력: 4, 10
        }
    }
}

결론

LINQ는 초보자부터 고급 개발자까지 모두에게 유용한 강력한 도구입니다.
단순한 데이터 필터링부터 복잡한 데이터 변환 및 그룹화 작업까지 다양한 상황에서 LINQ를 활용할 수 있습니다.
기본 문법을 익힌 뒤, 고급 문법을 활용하면 더 복잡한 데이터 처리도 쉽게 해결할 수 있습니다!

반응형