학습
C# LINQ 심화
C# LINQ 심화 — 중급
LINQ 심화
1. 도입 (왜 배워야 하는가)
LINQ(Language Integrated Query)는 C#의 강력한 데이터 쿼리 기능으로, 데이터베이스, XML, 컬렉션 등 다양한 데이터 소스에 대해 간편하게 데이터를 조회하고 조작할 수 있게 해줍니다. 특히 실무에서 LINQ를 사용하면 코드의 가독성을 높이고, 복잡한 데이터 처리 작업을 간단하게 수행할 수 있습니다.
LINQ를 모른다면, SQL 같은 쿼리 언어를 따로 배워야 할 수도 있고, 복잡한 루프를 짜야 하는 상황에 놓일 수 있어 코드 유지보수가 어려워질 수 있습니다. 또한, 성능 최적화나 코드 재사용성 측면에서도 비효율적인 방법을 사용할 가능성이 높습니다.
2. 핵심 개념 설명
2.1 LINQ의 정의
LINQ는 데이터를 쿼리할 수 있는 방법을 제공하며, 특히 C# 코드 안에 직접 쿼리 문법을 사용할 수 있도록 합니다. 데이터베이스에서 데이터를 가져오는 것뿐만 아니라, 메모리 내의 컬렉션에서도 사용할 수 있습니다.
2.2 LINQ의 주요 용어
| 용어 | 설명 |
|---|---|
| 쿼리 | 데이터를 조회하기 위한 명령어 |
| 쿼리 연산자 | 데이터 소스를 대상으로 하는 메서드 |
| 데이터 소스 | LINQ로 쿼리할 수 있는 데이터의 집합 |
3. 기본 코드 예제
아래의 코드는 LINQ를 사용하여 정수 배열에서 짝수만 필터링하는 기본 예제입니다.
using System;
using System.Linq;
class Program
{
static void Main()
{
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// LINQ 쿼리: 짝수만 선택
var evenNumbers = from n in numbers
where n % 2 == 0
select n;
// 결과 출력
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
}
}
실행 결과:
2
4
6
8
10
코드 동작 설명:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };- 정수 배열을 정의합니다.from n in numbers-numbers배열의 각 요소를n이라는 변수로 가져옵니다.where n % 2 == 0-n이 짝수인지 확인하고, 짝수인 경우만 선택합니다.select n- 필터링된 값을 선택하여 반환합니다.foreach (var num in evenNumbers)- 결과를 반복하여 출력합니다.- LINQ는 데이터 쿼리를 위한 강력한 도구로, 코드의 가독성을 높여줍니다.
- LINQ 쿼리는 지연 실행되므로 결과를 즉시 사용해야 합니다.
- 타입 불일치에 주의해야 하며, 적절한 타입 변환이 필요합니다.
- LINQ의 다양한 연산자를 활용하여 복잡한 데이터 조작을 간편하게 수행할 수 있습니다.
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 구현
쇼핑몰에서 장바구니에 담긴 상품 중에서 특정 조건을 만족하는 상품을 찾을 때, LINQ를 사용할 수 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
class Program
{
static void Main()
{
List<Product> cart = new List<Product>
{
new Product { Name = "상품 A", Price = 50.00m },
new Product { Name = "상품 B", Price = 30.00m },
new Product { Name = "상품 C", Price = 20.00m },
new Product { Name = "상품 D", Price = 70.00m }
};
// 30,000원 이상의 상품 필터링
var expensiveProducts = from p in cart
where p.Price >= 30.00m
select p;
foreach (var product in expensiveProducts)
{
Console.WriteLine(product.Name);
}
}
}
설명: 이 코드는 장바구니에 담긴 상품 중에서 가격이 30,000원 이상인 상품만 필터링하여 출력합니다.
예제 2: 학생 성적 필터링
학생 리스트에서 특정 조건에 따라 성적이 80점 이상인 학생을 찾는 예제입니다.
using System;
using System.Collections.Generic;
using System.Linq;
class Student
{
public string Name { get; set; }
public int Score { get; set; }
}
class Program
{
static void Main()
{
List<Student> students = new List<Student>
{
new Student { Name = "학생 A", Score = 85 },
new Student { Name = "학생 B", Score = 75 },
new Student { Name = "학생 C", Score = 90 },
new Student { Name = "학생 D", Score = 60 }
};
// 성적이 80점 이상인 학생 필터링
var highScorers = from s in students
where s.Score >= 80
select s;
foreach (var student in highScorers)
{
Console.WriteLine(student.Name);
}
}
}
설명: 이 코드는 학생 리스트에서 성적이 80점 이상인 학생의 이름을 출력합니다.
5. 흔한 실수와 주의사항
실수 1: 쿼리 결과를 즉시 실행하지 않음
LINQ 쿼리는 지연 실행되므로, 쿼리를 작성한 후 결과를 즉시 사용하지 않으면 예상치 못한 결과를 초래할 수 있습니다.
잘못된 코드:
var query = from n in numbers where n > 5 select n;
// query를 사용하지 않음
올바른 코드:
var result = query.ToList(); // 결과를 즉시 실행
실수 2: 타입 불일치
LINQ 쿼리에서 타입 불일치가 발생할 수 있습니다. 예를 들어, 정수형 배열과 문자열을 함께 사용할 경우 오류가 발생합니다.
잘못된 코드:
var mixedQuery = from n in numbers select n.ToString() + " is a number"; // 오류 발생
올바른 코드:
var mixedQuery = from n in numbers select n.ToString(); // 문제 없음
6. 정리
다음에 학습하면 좋은 주제: LINQ의 다양한 연산자 (Select, Where, GroupBy, Join 등)와 비동기 LINQ (PLINQ) 사용법.