IMCAT.DEV
로그인 가입
C# 중급 자료구조

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

코드 동작 설명:

  1. int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - 정수 배열을 정의합니다.
  2. from n in numbers - numbers 배열의 각 요소를 n이라는 변수로 가져옵니다.
  3. where n % 2 == 0 - n이 짝수인지 확인하고, 짝수인 경우만 선택합니다.
  4. select n - 필터링된 값을 선택하여 반환합니다.
  5. foreach (var num in evenNumbers) - 결과를 반복하여 출력합니다.
  6. 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는 데이터 쿼리를 위한 강력한 도구로, 코드의 가독성을 높여줍니다.
    • LINQ 쿼리는 지연 실행되므로 결과를 즉시 사용해야 합니다.
    • 타입 불일치에 주의해야 하며, 적절한 타입 변환이 필요합니다.
    • LINQ의 다양한 연산자를 활용하여 복잡한 데이터 조작을 간편하게 수행할 수 있습니다.

다음에 학습하면 좋은 주제: LINQ의 다양한 연산자 (Select, Where, GroupBy, Join 등)와 비동기 LINQ (PLINQ) 사용법.