FirstOrDefault() 메서드는 시퀀스(컬렉션)에서 첫 번째 요소를 반환하며, 요소가 존재하지 않을 경우 해당 타입의 기본값(default value)을 반환하는 LINQ 메서드입니다.
FirstOrDefault() 메서드란?
일반적인 First() 메서드는 빈 컬렉션에서 호출되면 InvalidOperationException 예외를 발생시킵니다. 반면 FirstOrDefault()는 예외를 던지는 대신 기본값을 조용히 반환하기 때문에, 컬렉션이 비어 있을 가능성이 있는 상황에서 안전하게 사용할 수 있습니다.
- 숫자 타입(int, double 등)의 경우 기본값은 0
- 참조 타입(string, 클래스 등)의 경우 기본값은 null
- bool 타입의 경우 기본값은 false
빈 리스트 예제
다음과 같이 비어 있는 List가 있다고 가정해 보겠습니다.
List<double> val = new List<double> { };
이 리스트는 비어 있는 컬렉션이므로 첫 번째 요소를 표시할 수 없습니다. 이럴 때 FirstOrDefault() 메서드를 사용하면 예외 없이 기본값(0)을 얻을 수 있습니다.
val.AsQueryable().FirstOrDefault();
전체 코드 예제
using System;
using System.Collections.Generic;
using System.Linq;
class Demo {
static void Main() {
List<double> val = new List<double> { };
double d = val.AsQueryable().FirstOrDefault();
Console.WriteLine("Default Value = " + d);
if (d == 0.0D) {
d = 0.1D;
}
Console.WriteLine("Default Value changed = " + d);
}
}
실행 결과
Default Value = 0 Default Value changed = 0.1
코드 설명
위 예제의 동작 흐름은 다음과 같습니다.
- 비어 있는
List<double>을 생성합니다. AsQueryable()로 쿼리 가능한 형태로 변환한 뒤FirstOrDefault()를 호출합니다.- 요소가 없으므로 double 타입의 기본값인 0이 반환됩니다.
- 반환된 값이 0.0인지 확인하여, 필요에 따라 새로운 값(0.1)으로 변경할 수 있습니다.
FirstOrDefault()와 First()의 차이점
| 메서드 | 빈 컬렉션일 때 동작 |
|---|---|
| First() | InvalidOperationException 예외 발생 |
| FirstOrDefault() | 타입별 기본값 반환 (예외 없음) |
컬렉션에 항상 데이터가 있다고 보장할 수 없다면, 예외 처리를 별도로 하지 않아도 되는 FirstOrDefault()를 사용하는 것이 더 안전하고 간결한 코드를 작성하는 방법입니다.