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에는 두 가지 스타일이 있습니다.
- 쿼리 구문(Query Syntax) → SQL과 유사한 형태
- 메서드 구문(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)