Debug & Think

[C#] [LINQ] First(), FirstOrDefault(), Find() 차이점 정리 본문

카테고리 없음

[C#] [LINQ] First(), FirstOrDefault(), Find() 차이점 정리

J.Note 2025. 6. 8. 18:49

 

LINQ를 쓰다 보면 First(), FirstOrDefault(), Find() 같은 메서드를 자주 마주치게 되는데,
겉보기엔 비슷해 보여도 각각 쓰임새가 미묘하게 달라서 가끔 헷갈릴 때가 있습니다.

그래서 헷갈리지 않도록, 이 셋의 차이점과 언제 어떤 걸 써야 할지 한 번 정리해봤습니다.

 

✅ 기본 비교

항목  First() (LINQ) FirstOrDefault () (LINQ) Find()
대상 컬렉션 IEnumerable<T>(배열, 리스트 등) IEnumerable<T>(배열, 리스트 등) List<T> 전용
반환값 조건에 맞는 첫 번째 요소 조건에 맞는 첫 번째 요소
또는 기본값
조건에 맞는 첫 번째 요소
또는 기본값
조건 불일치 시 예외 발생
(InvalidOperationException)
default 반환 default 반환
내부 구현 foreach 기반 foreach 기반 for 루프 기반 (List에 최적화)

 

✅ 장단점 비교

 

항목  First() (LINQ) FirstOrDefault () (LINQ) Find()
장점 - 배열, 리스트, LINQ 모두 사용 가능
- LINQ 메서드 활용 
  (Where().First() 등)


- 배열, 리스트, LINQ 모두 사용 가능
- LINQ 메서드 활용
  (Where(). FirstOrDefault () 등)

- 조건 불일치 시에도 예외 미발생
- List<T>에 최적화 → 미세하게 빠름
- 조건 불일치 시에도 예외 미발생
단점 - 예외 발생 
  → try-catch 필요
- default 반환
  null 체크 또는 기본값 처리 필요
- List<T>에서만 사용 가능
- LINQ 메서드 활용 불가
  (Where(...).Find(...) 불가)
- default 반환이라 
  null 체크 또는 기본값 처리 필요

 


First  VS FirstOrDefault

First()를 사용하는 이유

 

  • 존재 보장 시 의도 명확화
    → 조건을 만족하는 요소가 반드시 존재해야 함을 코드로 드러남
    (예: 불변 데이터, 필수 설정 등)
  • 버그 조기 발견
    → 값이 없으면 예외 발생 → 문제를 조기에 인지 가능
    → 반대로 FirstOrDefault()는 null 반환 → 버그가 늦게 드러날 수 있음
  • 코드 간결성
    → 값이 항상 존재한다면 null 체크 없이 깔끔하게 처리 가능

 

FirstOrDefault()의 사용 이유

  • 존재하지 않을 수 있는 경우에 안전하게 처리
    → 조건을 만족하는 요소가 없으면 예외 없이 기본값(null 등) 반환
    → try-catch 없이 null 체크로 처리 가능
  • 코드 단순화
    → 예외 처리가 필요 없어 코드가 더 깔끔해짐
  •  

 

그렇다면 어떤 상황에서 써야 할까?

상황추천 메서드 이유
조건을 반드시 만족하는 요소가 존재해야 함 First() 존재 보장 시 명확한 코드, 버그 조기 발견
조건을 만족하지 않을 수도 있음 FirstOrDefault() 예외 없이 기본값 반환, 안전한 처리
List<T>에서만 빠르게 찾고 싶을 때 Find() 성능 최적화, 간편한 사용 (LINQ는 불가)

🎯 성능 차이는 일반적으로 미미하지만, 빈번하게 호출되거나 데이터가 많을 때는 Find()가 유리할 것 같다.

 

 

 

✅ 간단 코드 예시

// First 
var item1 = list.First(x => x.Id == 5); // 조건 불일치 시 예외 
// FirstOrDefault 
var item2 = list.FirstOrDefault(x => x.Id == 5); // 없으면 null 
// Find 
var item3 = list.Find(x => x.Id == 5); // 없으면 null, List<T>에서만 가능
 

 


 

🔖 마무리 요약

  • First() :  "반드시 있어야 한다"는 전제에서 사용 → 실패 시 예외 문제 조기 발견
  • FirstOrDefault() : "없을 수도 있음"을 고려한 유연한 방식
  • Find() : List<T>에서만 쓰는 빠르고 안전한 방법, 다만 LINQ 활용에는 불리