반응형
LINQ (Language-Integrated Query)란?
**LINQ (Language-Integrated Query)**는 C#에서 제공하는 강력한 데이터 쿼리 기능입니다.
SQL과 유사한 방식으로 데이터를 검색, 필터링, 정렬, 변환할 수 있도록 도와줍니다.
LINQ는 데이터를 처리하는 방식을 간결하게 표현할 수 있어, 컬렉션, XML, 데이터베이스 등 다양한 데이터 소스에서 사용됩니다.
LINQ의 핵심 개념
- 컬렉션과 데이터 쿼리
LINQ는 배열, 리스트, 데이터베이스 등에서 데이터를 쿼리할 수 있는 기능을 제공합니다. - 표현식 기반
SQL처럼 데이터를 처리하는 쿼리를 간단한 표현식으로 작성할 수 있습니다. - 타입 안전
LINQ는 컴파일 시점에 오류를 검출할 수 있어 안전한 코드를 작성할 수 있습니다.
LINQ를 왜 사용하나?
- 가독성
복잡한 데이터 처리 로직을 간단한 쿼리 문법으로 표현할 수 있습니다. - 일관성
다양한 데이터 소스(컬렉션, XML, 데이터베이스 등)를 동일한 방식으로 처리할 수 있습니다. - 유지보수성
명확한 문법 덕분에 코드의 유지보수가 쉬워집니다.
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의 주요 메서드
- Where
특정 조건에 맞는 데이터를 필터링합니다. - var filtered = list.Where(x => x > 10);
- Select
데이터를 변환합니다. - var squared = list.Select(x => x * x);
- OrderBy / OrderByDescending
데이터를 정렬합니다. - var sorted = list.OrderBy(x => x);
- GroupBy
데이터를 그룹화합니다. - var grouped = list.GroupBy(x => x % 2 == 0 ? "짝수" : "홀수");
- Aggregate
데이터를 누적하여 하나의 결과를 만듭니다. - 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를 활용할 수 있습니다.
기본 문법을 익힌 뒤, 고급 문법을 활용하면 더 복잡한 데이터 처리도 쉽게 해결할 수 있습니다!
반응형
'C#' 카테고리의 다른 글
C# `ref`와 `out` 키워드의 차이점과 활용법 (2) | 2025.01.16 |
---|---|
`TimeSpan.FromSeconds` vs `Thread.Sleep`: 차이와 올바른 사용법 (0) | 2025.01.16 |
ProcessorAffinity로 CPU 코어 활용 제어하기 (28) | 2025.01.14 |
C# 람다식: 간결하고 강력한 익명 함수 이해하기 (0) | 2025.01.13 |
SocketException: '각 소켓 주소는 하나만 사용할 수 있습니다' 에러 원인 및 해결법 (0) | 2025.01.10 |
C# internal: 어셈블리 내 접근 제한자 (0) | 2025.01.10 |
C# Struct vs Class: 차이점과 최적 사용 사례 (0) | 2025.01.06 |
재미로 만드는 로또 번호 생성기 #2_로또 API를 이용해서 당첨 번호 조회하기. (2) | 2025.01.05 |