반응형
LINQ(Language Integrated Query)는 C#에서 데이터 쿼리 및 변환 작업을 위한 강력한 기능입니다. 다양한 데이터 소스(배열, 컬렉션, XML, 데이터베이스 등)에 대해 일관된 방식으로 쿼리를 작성할 수 있게 해줍니다.
1. 쿼리 구문
SQL과 유사한 문법을 사용합니다.
*SQL이란? SQL은 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계한 특수 목적의 프로그래밍 언어이다.
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var evenNumbers = from num in numbers where num % 2 == 0 select num; foreach (var num in evenNumbers) { Console.WriteLine(num); }
2. 메서드 구문
확장 메서드를 체인으로 연결하여 사용합니다.
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var evenNumbers = numbers.Where(num => num % 2 == 0); foreach (var num in evenNumbers) { Console.WriteLine(num); }
3. 람다 표현식
람다 표현식은 익명 함수를 간단히 표현하는 방법으로, LINQ와 함께 자주 사용됩니다.
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 기본 문법: (매개변수) => 식 또는 { 구문; } // 예시 Func<int, bool> isEven = (num) => num % 2 == 0; var evenNumbers = numbers.Where(isEven);
4. LINQ의 주요 연산자
• Where: 조건에 맞는 요소 필터링
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var evenNumbers = numbers.Where(n => n % 2 == 0); // 결과: 2, 4, 6, 8, 10
• Select: 각 요소를 변환합니다.
List<string> names = new List<string> { "Alice", "Bob", "Charlie" }; var lengths = names.Select(name => name.Length); // 결과: 5, 3, 7
• OrderBy/OrderByDescending: 요소를 오름차순 또는 내림차순으로 정렬합니다.
List<string> fruits = new List<string> { "apple", "banana", "cherry" }; var sortedFruits = fruits.OrderBy(f => f.Length); // 결과: apple, cherry, banana
• GroupBy: 특정 키를 기준으로 요소를 그룹화합니다.List<Person> people = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 }, new Person { Name = "Charlie", Age = 25 } }; var groupedByAge = people.GroupBy(p => p.Age); // 결과: 25: [Alice, Charlie], 30: [Bob]
• Join: 두 컬렉션을 결합합니다.
List<Order> orders = new List<Order> { new Order { Id = 1, CustomerId = 1 }, new Order { Id = 2, CustomerId = 2 } }; List<Customer> customers = new List<Customer> { new Customer { Id = 1, Name = "Alice" }, new Customer { Id = 2, Name = "Bob" } }; var query = orders.Join(customers, o => o.CustomerId, c => c.Id, (o, c) => new { OrderId = o.Id, CustomerName = c.Name }); // 결과: { OrderId = 1, CustomerName = "Alice" }, { OrderId = 2, CustomerName = "Bob" }
• First / FirstOrDefault: 조건을 만족하는 첫 번째 요소를 반환합니다. FirstOrDefault는 요소가 없을 경우 기본값을 반환합니다.List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; int firstEven = numbers.First(n => n % 2 == 0); // 2 int firstOver10 = numbers.FirstOrDefault(n => n > 10); // 0 (int의 기본값)
• Any/All: Any는 조건을 만족하는 요소가 하나라도 있는지, All은 모든 요소가 조건을 만족하는지 확인합니다.bool hasEven = numbers.Any(n => n % 2 == 0); // true bool allPositive = numbers.All(n => n > 0); // true
• Count: 조건을 만족하는 요소의 개수를 반환합니다.int evenCount = numbers.Count(n => n % 2 == 0); // 2
• Sum / Average / Min / Max: 숫자 컬렉션에 대한 계산을 수행합니다.int sum = numbers.Sum(); // 15 double average = numbers.Average(); // 3 int min = numbers.Min(); // 1 int max = numbers.Max(); // 5
• Distinct: 중복을 제거합니다.List<int> numbers = new List<int> { 1, 2, 2, 3, 3, 3 }; var distinct = numbers.Distinct(); // 결과: 1, 2, 3
이러한 LINQ 연산자들을 조합하여 복잡한 데이터 처리 작업을 간결하고 효과적으로 수행할 수 있습니다. 게임 개발에서는 예를 들어 플레이어 데이터 필터링, 아이템 정렬, 스코어 계산 등 다양한 상황에서 이러한 연산자들을 활용할 수 있습니다.
5. LINQ의 장점
• 타입 안정성: 컴파일 시점에 오류 검출
• IntelliSence 지원: 자동 완성 및 오류 표시
• 다양한 데이터 소스에 대한 일관된 쿼리 방식
• 코드의 가독성과 유지보수성 향상
6. 주의사항
• 성능: 복잡한 LINQ 쿼리는 성능에 영향을 줄 수 있음
• 지연 실행: 대부분의 LINQ 연산은 실제 데이터가 필요할 때까지 실행을 지연함
[정리하며]
LINQ는 C#에서 데이터 처리를 위한 강력하고 유연한 도구입니다. 적절히 사용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다. 게임 개발에서도 컬렉션 처리, 데이터 필터링, 변환 등 다양한 상황에서 유용하게 활용할 수 있습니다.
반응형
'Programming Languages > C# 고급문법' 카테고리의 다른 글
[C# 고급문법] 비동기 프로그래밍 (async, await, Task 클래스) (0) | 2024.09.13 |
---|---|
[C# 고급문법] 이벤트와 델리게이트: delegate편 (0) | 2024.09.10 |
[C# 고급문법] 제네릭 (Generic) (0) | 2024.09.10 |