반응형
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 연산은 실제 데이터가 필요할 때까지 실행을 지연함

 

 

[정리하며]

LINQC#에서 데이터 처리를 위한 강력하고 유연한 도구입니다. 적절히 사용하면 코드의 가독성유지보수성을 크게 향상시킬 수 있습니다. 게임 개발에서도 컬렉션 처리, 데이터 필터링, 변환 등 다양한 상황에서 유용하게 활용할 수 있습니다.

반응형

+ Recent posts