2024. 9. 27. 02:33ㆍc#
LINQ (Language Integrated Query) 기초
LINQ는 C#에서 데이터 소스에 대해 일관성 있고 간결한 쿼리를 작성할 수 있게 해주는 강력한 기능입니다.
LINQ는 데이터베이스, XML, 컬렉션, 배열 등 다양한 데이터 소스에 대해 동일한 구문을 사용할 수 있어 매우 유용합니다. 이 글에서는 LINQ의 기본 개념과 함께 C#에서 어떻게 활용할 수 있는지 기초적인 사용법을 설명하겠습니다.
1. LINQ란 무엇인가?
LINQ(Language Integrated Query)는 C#에서 데이터를 질의하는 통합된 방법을 제공하는 기능입니다.
LINQ는 SQL과 비슷한 구문을 사용해 데이터를 조회, 필터링, 변환 등의 작업을 수행할 수 있으며, 이를 통해 다양한 데이터 소스에 대해 통합된 쿼리 방법을 제공합니다.
주요 데이터 소스:
- 컬렉션 (List, Array, Dictionary 등)
- 데이터베이스 (SQL Server, MySQL 등)
- XML 파일
- Entity Framework와 같은 ORM
2. LINQ 기본 구문
LINQ는 두 가지 스타일로 사용할 수 있습니다.
1) Query 구문
SQL과 유사한 쿼리 스타일로 작성할 수 있습니다.
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
foreach (var number in evenNumbers)
{
Console.WriteLine(number); // 출력: 2, 4
}
2) Method 구문
메서드 체이닝을 사용하는 방식으로도 LINQ 쿼리를 작성할 수 있습니다. 이는 람다 표현식과 함께 사용되는 경우가 많습니다.
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
foreach (var number in evenNumbers)
{
Console.WriteLine(number); // 출력: 2, 4
}
3. LINQ의 주요 메서드
LINQ는 다양한 메서드를 제공하여 데이터를 필터링, 정렬, 변환할 수 있습니다.
여기서는 자주 사용되는 기본 메서드를 살펴보겠습니다.
1) Where: 필터링
Where 메서드는 조건에 맞는 요소들만 필터링하는 데 사용됩니다.
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };
var shortNames = names.Where(name => name.Length <= 4);
foreach (var name in shortNames)
{
Console.WriteLine(name); // 출력: Bob
}
2) Select: 변환
Select 메서드는 데이터를 변환하거나 가공하는 데 사용됩니다. 데이터를 다른 형태로 변환할 때 유용합니다.
int[] numbers = { 1, 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(n => n * n).ToList();
foreach (var number in squaredNumbers)
{
Console.WriteLine(number); // 출력: 1, 4, 9, 16, 25
}
3) OrderBy / OrderByDescending: 정렬
데이터를 오름차순 또는 내림차순으로 정렬할 때 사용됩니다.
int[] numbers = { 5, 2, 8, 1, 4 };
var sortedNumbers = numbers.OrderBy(n => n).ToList();
foreach (var number in sortedNumbers)
{
Console.WriteLine(number); // 출력: 1, 2, 4, 5, 8
}
4) GroupBy: 그룹화
데이터를 특정 기준에 따라 그룹으로 나누는 메서드입니다.
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };
var groupedNames = names.GroupBy(name => name.Length);
foreach (var group in groupedNames)
{
Console.WriteLine($"이름의 길이: {group.Key}");
foreach (var name in group)
{
Console.WriteLine(name); // 그룹화된 이름들 출력
}
}
5) First / FirstOrDefault: 첫 번째 요소 가져오기
조건에 맞는 첫 번째 요소를 가져오는 데 사용됩니다.
List<int> numbers = new List<int> { 1, 3, 5, 7, 9 };
var firstOddNumber = numbers.First(n => n > 3);
Console.WriteLine(firstOddNumber); // 출력: 5
4. LINQ와 컬렉션
LINQ는 다양한 컬렉션 타입에 적용할 수 있습니다. 예를 들어, 배열, 리스트, 딕셔너리 등과 함께 사용할 수 있습니다.
1) 배열과 LINQ
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToArray();
2) 리스트와 LINQ
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };
var namesWithA = names.Where(name => name.Contains("a")).ToList();
3) 딕셔너리와 LINQ
Dictionary<int, string> students = new Dictionary<int, string>
{
{ 1, "John" },
{ 2, "Jane" },
{ 3, "Jim" }
};
var filteredStudents = students.Where(s => s.Key > 1).ToDictionary(s => s.Key, s => s.Value);
foreach (var student in filteredStudents)
{
Console.WriteLine($"{student.Key}: {student.Value}"); // 출력: 2: Jane, 3: Jim
}
5. LINQ의 장점
LINQ는 다음과 같은 여러 장점을 제공합니다.
- 통합된 구문: LINQ는 다양한 데이터 소스에 대해 동일한 구문을 사용할 수 있습니다.
- 가독성: LINQ 쿼리는 데이터 처리 로직을 간결하게 표현하므로 코드 가독성이 높아집니다.
- 타입 안정성: LINQ는 강력한 타입 안정성을 제공하므로 컴파일 타임에 오류를 잡을 수 있습니다.
- 확장성: LINQ는 다양한 데이터 소스 및 컬렉션을 지원하며, 사용자 정의 쿼리 연산자를 추가할 수도 있습니다.
6. LINQ를 사용한 데이터베이스 쿼리
LINQ는 단순히 컬렉션뿐만 아니라 LINQ to SQL, Entity Framework 등을 통해 데이터베이스 쿼리에도 사용할 수 있습니다. 예를 들어, SQL Server와 같은 관계형 데이터베이스에서 LINQ를 사용하여 데이터베이스 질의를 작성할 수 있습니다.
using (var context = new SchoolContext())
{
var students = from s in context.Students
where s.Age > 20
select s;
foreach (var student in students)
{
Console.WriteLine(student.Name);
}
}
LINQ는 C#에서 데이터를 처리하는 데 매우 유용한 도구입니다.
일관된 구문과 강력한 타입 안정성을 제공하며, 컬렉션이나 데이터베이스와 같은 다양한 데이터 소스에 대해 쉽게 쿼리를 작성할 수 있습니다. LINQ의 기초 개념을 잘 이해하면, 복잡한 데이터 처리도 간결하고 효율적으로 구현할 수 있습니다.
'c#' 카테고리의 다른 글
c# 컬렉션(Collection)의 성능 및 메모리 관리 (0) | 2024.09.29 |
---|---|
c# LINQ를 사용한 데이터 쿼리 및 필터링 (1) | 2024.09.27 |
C# 람다 표현식(Lambda Expression)의 사용법 (1) | 2024.09.25 |
c# 이벤트(Event) 생성 및 구독 (0) | 2024.09.25 |
c# 델리게이트(delegate)의 개념과 사용법 (0) | 2024.09.25 |