2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

C#에서 LINQ의 Select와 Where의 차이는 무엇인가요?

_____
자주 묻는 질문(FAQ)

Q1. LINQ의 Select와 Where는 각각 무슨 역할을 하나요?
A1.
- Select: 컬렉션의 각 요소를 지정한 형태(프로퍼티, 익명 타입, 계산 결과 등)로 ‘투영(projection)’합니다. 즉, 원본 요소 자체를 변환(transform)하거나 새로운 값을 생성해 반환합니다.
- Where: 컬렉션의 각 요소에 대해 지정한 조건(predicate)을 평가하여 ‘필터링(filtering)’합니다. 조건을 만족하는 요소만 결과 시퀀스에 남깁니다.

Q2. 반환되는 결과의 형태는 어떻게 다른가요?
A2.
- Select: 원본 컬렉션의 요소 타입을 새로운 타입(TResult)으로 바꿔 반환합니다. 예를 들어 Person → string(Name) 또는 Person → new { Name, Age } 등으로 변환할 수 있습니다.
- Where: 반환되는 시퀀스의 요소 타입은 원본과 동일합니다. 단, 조건에 부합하는 일부 요소만 남습니다.

Q3. 실행 시점(deferred execution) 차이가 있나요?
A3.
둘 다 지연 실행(Delayed/Deferred Execution)을 지원합니다. 즉, 실제로 데이터를 열거(enumeration)하기 전까지는 쿼리 식이 실행되지 않습니다.
- Where에서 필터링 동작은 foreach나 ToList, ToArray 등을 호출할 때 이루어집니다.
- Select에서도 마찬가지로 투영 로직은 열거 시점에 실행됩니다.

Q4. 내부 구현 관점에서 처리 방식은 어떻게 다른가요?
A4.
- Where: 내부적으로 Predicate 타입의 델리게이트를 받아 요소마다 이 함수를 호출하여 true인 요소만 다음 파이프라인으로 넘깁니다.
- Select: 내부적으로 Func 타입의 델리게이트를 받아 각 요소를 TResult 타입으로 매핑(mapping)합니다.
두 연산 모두 IEnumer­able 연산자로 구현되며, 호출 시 새로운 이터레이터(iterator)를 리턴해 체이닝을 지원합니다.

Q5. 사용 예시는 어떻게 되나요?
A5.
1) Where만 사용:
var adults = people.Where(p => p.Age >= 18);
// 나이가 18 이상인 Person 객체만 반환
2) Select만 사용:
var names = people.Select(p => p.Name);
// Person에서 Name 프로퍼티만 추출한 문자열 시퀀스 반환
3) Where + Select 조합:
var adultNames = people
.Where(p => p.Age >= 18) // 필터링
.Select(p => p.Name); // 투영

Q6. 성능 관점에서 주의할 점이 있나요?
A6.
- 둘 다 지연 실행되므로 불필요한 ToList/ToArray 호출을 최소화해 중간 버퍼링 비용을 줄이는 것이 좋습니다.
- Where와 Select를 체이닝할 때 Where(필터) → Select(투영) 순서가 일반적으로 더 효율적입니다. (필요 없는 요소를 먼저 제거)
- 복잡한 람다식이나 중첩 쿼리를 남발하면 실행 시점에 비용이 증가하므로, 가능하면 간단한 조건과 프로젝션으로 나누어 작성하세요.

Q7. 메서드 문법과 쿼리 식(Query syntax)에서의 차이는 무엇인가요?
A7.
- 메서드 문법(Method syntax): people.Where(...).Select(...) 형태로 체이닝
- 쿼리 식(Query syntax):
from p in people
where p.Age >= 18
select p.Name;
기능적으로 동일하며, 컴파일 시 메서드 문법으로 변환됩니다. 취향, 가독성, 팀 컨벤션에 따라 선택하세요.
LINQ (Language Integrated Query)는 C 에서 데이터 쿼리를 수행하기 위한 강력한 기능을 제공합니다.

LINQ를 사용하면 데이터 소스(예: 배열, 리스트, 데이터베이스 등)에 대해 SQL과 유사한 방식으로 쿼리를 작성할 수 있습니다.

LINQ의 주요 메서드 중 두 가지인 `Select`와 `Where`는 각각 다른 목적을 가지고 있으며, 이 두 메서드의 차이를 이해하는 것은 LINQ를 효과적으로 사용하는 데 매우 중요합니다.

Select `Select` 메서드는 주어진 컬렉션의 각 요소를 변환하여 새로운 형태의 컬렉션을 생성하는 데 사용됩니다.

즉, `Select`는 요소의 프로젝션을 수행합니다.

이 메서드는 각 요소에 대해 특정 작업을 수행하고, 그 결과를 새로운 컬렉션으로 반환합니다.

예를 들어, 다과 같은 코드가 있다고 가정해 보겠습니다: ```csharp var numbers = new List { 1, 2, 3, 4, 5 }; var squaredNumbers = numbers.Select(n => n * n).ToList(); ``` 위의 코드에서 `Select`는 `numbers` 리스트의 각 요소를 제곱하여 새로운 리스트 `squaredNumbers`를 생성합니다.

결과적으로 `squaredNumbers`는 `{ 1, 4, 9, 16, 25 }`가 됩니다.

이처럼 `Select`는 각 요소를 변환하는 데 초점을 맞추고 있습니다.

Where 반면에 `Where` 메서드는 주어진 조건을 만족하는 요소만을 필터링하여 새로운 컬렉션을 생성하는 데 사용됩니다.

즉, `Where`는 조건을 기반으로 요소를 선택하는 데 중점을 둡니다.

이 메서드는 주어진 조건을 만족하는 요소만을 반환합니다.

다음은 `Where` 메서드를 사용하는 예입니다: ```csharp var numbers = new List { 1, 2, 3, 4, 5 }; var evenNumbers = numbers.Where(n => n % 2 == 0).ToList(); ``` 위의 코드에서 `Where`는 `numbers` 리스트에서 짝수인 요소만을 필터링하여 새로운 리스트 `evenNumbers`를 생성합니다.

결과적으로 `evenNumbers`는 `{ 2, 4 }`가 됩니다.

이처럼 `Where`는 특정 조건을 만족하는 요소를 선택하는 데 중점을 두고 있습니다.

요약 - Select : 각 요소를 변환하여 새로운 형태의 컬렉션을 생성합니다.

주로 프로젝션에 사용됩니다.

- Where : 주어진 조건을 만족하는 요소만을 필터링하여 새로운 컬렉션을 생성합니다.

주로 조건 기반 선택에 사용됩니다.

이 두 메서드는 LINQ 쿼리에서 자주 함께 사용되며, 데이터를 변환하고 필터링하는 데 매우 유용합니다.

예를 들어, 특정 조건을 만족하는 요소를 선택한 후, 그 요소들을 변환하는 작업을 동시에 수행할 수 있습니다: ```csharp var numbers = new List { 1, 2, 3, 4, 5 }; var result = numbers.Where(n => n % 2 == 0).Select(n => n * n).ToList(); ``` 위의 예제에서는 먼저 짝수인 요소를 필터링하고, 그 결과를 제곱하여 새로운 리스트를 생성합니다.

이처럼 `Select`와 `Where`를 조합하여 더욱 복잡한 쿼리를 작성할 수 있습니다.

`Select`와 `Where`는 LINQ에서 각각 다른 역할을 수행하며, 데이터 처리 시 이 두 메서드를 적절히 활용하는 것이 중요합니다.

작성자: 정다영 [비회원] | 작성일자: 1년 전 2024-09-09 08:38:57
조회수: 257 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.