본문 바로가기
카테고리 없음

C# LINQ 초보자 가이드: 개념부터 기본 예제까지

by bbongz 2025. 3. 7.

C#을 사용하다 보면 데이터를 더 쉽게 다룰 수 있도록 도와주는 LINQ(Language Integrated Query) 를 접하게 됩니다. LINQ를 잘 활용하면 컬렉션(List, Array 등)이나 데이터베이스에서 데이터를 간결하고 효율적으로 조회하고 조작할 수 있어요!

이번 글에서는 초보자도 쉽게 이해할 수 있도록 LINQ의 기본 개념과 실전 예제를 하나씩 살펴보겠습니다.


1. LINQ란 무엇인가?

LINQ는 C#에서 데이터를 다루는 질의(Query) 문법을 제공합니다. SQL과 비슷한 방식으로 컬렉션(List, Array, Dictionary 등)이나 데이터베이스에서 원하는 데이터를 간단하고 직관적으로 가져올 수 있습니다.

 

LINQ의 주요 특징

  • 간결한 코드: for 또는 foreach 반복문 없이 데이터를 필터링하고 조작할 수 있음
  • 일관된 문법: SQL, XML, JSON, 데이터베이스, 객체 컬렉션 등 다양한 데이터 소스에 적용 가능
  • 지연 실행: 성능 최적화를 위해 필요할 때만 연산 수행

2. LINQ 기본 문법

LINQ에는 두 가지 스타일이 있습니다.

  1. 쿼리 구문(Query Syntax) → SQL과 유사한 형태
  2. 메서드 구문(Method Syntax) → 메서드 체이닝(함수형 스타일)

둘 다 같은 결과를 얻을 수 있으며, 상황에 따라 적절히 선택하면 됩니다.


🔹 2-1. LINQ 쿼리 구문 (Query Syntax)

SQL과 비슷한 방식으로 데이터를 필터링할 수 있습니다.

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        // LINQ 쿼리 구문을 사용한 짝수 필터링
        var evenNumbers = from num in numbers
                          where num % 2 == 0
                          select num;

        Console.WriteLine("짝수 목록:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}

코드 설명

  • from num in numbers → 컬렉션에서 데이터를 가져옴
  • where num % 2 == 0 → 짝수만 필터링
  • select num → 최종 결과 선택

출력 결과:

짝수 목록:
2
4
6
8
10

🔹 2-2. LINQ 메서드 구문 (Method Syntax)

메서드를 체이닝하여 더 직관적인 방식으로 데이터를 다룰 수 있습니다.

var evenNumbers = numbers.Where(num => num % 2 == 0);

foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}

코드 설명

  • .Where(num => num % 2 == 0) → where 키워드 대신 람다 표현식 사용
  • num => num % 2 == 0 → num이 2로 나누어떨어지는 경우만 선택

3. LINQ 실전 예제

LINQ는 단순 필터링 외에도 다양한 기능을 제공합니다. 몇 가지 실용적인 예제를 살펴볼까요?

🟢 3-1. 리스트에서 특정 조건의 데이터 찾기

List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };

// 이름 길이가 4 이상인 사람 찾기
var filteredNames = names.Where(name => name.Length >= 4);

Console.WriteLine("이름이 4자 이상인 사람:");
foreach (var name in filteredNames)
{
    Console.WriteLine(name);
}

출력 결과:

이름이 4자 이상인 사람:
Alice
Charlie
David

🟢 3-2. 객체 리스트 정렬하기 (OrderBy)

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

List<Person> people = new List<Person>
{
    new Person { Name = "Alice", Age = 25 },
    new Person { Name = "Bob", Age = 30 },
    new Person { Name = "Charlie", Age = 22 }
};

// 나이순 정렬
var sortedPeople = people.OrderBy(p => p.Age);

Console.WriteLine("나이순 정렬:");
foreach (var person in sortedPeople)
{
    Console.WriteLine($"{person.Name} - {person.Age}세");
}

출력 결과:

나이순 정렬:
Charlie - 22세
Alice - 25세
Bob - 30세

🟢 3-3. 그룹화(GroupBy) 활용

List<string> words = new List<string> { "apple", "banana", "cherry", "apricot", "blueberry" };

// 첫 글자 기준 그룹화
var groupedWords = words.GroupBy(w => w[0]);

foreach (var group in groupedWords)
{
    Console.WriteLine($"'{group.Key}'로 시작하는 단어들:");
    foreach (var word in group)
    {
        Console.WriteLine(word);
    }
}

출력 결과:

'A'로 시작하는 단어들:
apple
apricot
'B'로 시작하는 단어들:
banana
blueberry
'C'로 시작하는 단어들:
cherry

4. LINQ를 잘 쓰는 팁

FirstOrDefault(), SingleOrDefault() 사용하기

  • FirstOrDefault() → 조건을 만족하는 첫 번째 요소 반환 (없으면 null 반환)
  • SingleOrDefault() → 조건을 만족하는 요소가 딱 하나만 있을 때 사용 (없거나 2개 이상이면 예외 발생)

지연 실행 이해하기
LINQ의 Where(), Select() 같은 메서드는 실제 데이터가 필요할 때까지 실행되지 않음.

var query = numbers.Where(n => n > 5); // 아직 실행 안 됨

반복문에서 데이터를 조회할 때 실행됨

foreach (var num in query)
{
    Console.WriteLine(num); // 이때 실행됨
}

5. 마무리

이제 LINQ의 기본 개념과 활용법을 익혔습니다! 반복문을 줄이고 가독성을 높이는 LINQ를 적극 활용해보세요.

다음 글에서 아래의 심화 내용을 다룰 예정이니 기대해주세요!

  • LINQ의 고급 기능 (Join, SelectMany)
  • LINQ와 데이터베이스 연동 (Entity Framework)