본문 바로가기
CSharp/CSharp 문법

LINQ의 First() vs FirstOrDefault() 차이 이해하기

by MonoSoft 2025. 10. 21.
728x90
반응형

LINQ의 First() vs FirstOrDefault() 차이 이해하기

 

LINQ에서 컬렉션의 첫 번째 요소를 가져올 때 사용하는 메서드로 
**First()**와 **FirstOrDefault()**가 있습니다.
둘 다 비슷하지만, 데이터가 존재하지 않을 때의 동작이 다릅니다.

First(): 조건을 만족하는 요소가 없으면 예외(InvalidOperationException) 발생

FirstOrDefault(): 조건을 만족하지 않으면 기본값(default)을 반환 (null 또는 값형의 0, false 등)

실무에서 “없을 수도 있는 데이터”를 다룰 땐 FirstOrDefault()를 사용하는 것이 안전합니다.

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

class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "Alice", "Bob", "Charlie" };

        // 조건을 만족하는 첫 번째 항목
        string found = names.First(n => n.StartsWith("B"));
        Console.WriteLine($"[First] 결과: {found}");

        // 조건을 만족하지 않는 경우
        try
        {
            string notFound = names.First(n => n.StartsWith("Z"));
            Console.WriteLine($"[First] 결과: {notFound}");
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine($"[First] 예외 발생: {ex.Message}");
        }

        // 안전한 버전
        string safeResult = names.FirstOrDefault(n => n.StartsWith("Z"));
        Console.WriteLine($"[FirstOrDefault] 결과: {(safeResult ?? "null")}");
    }
}

실행 결과
[First] 결과: Bob
[First] 예외 발생: 시퀀스에 일치하는 요소가 없습니다.
[FirstOrDefault] 결과: null

First()는 반드시 조건을 만족하는 데이터가 존재해야 합니다.
FirstOrDefault()는 없을 경우 타입의 기본값을 반환합니다.
참조형 → null
값형 → 0, false, DateTime.MinValue 등
First()를 사용할 때는 Any()로 미리 존재 여부를 확인하는 것이 
안전합니다.

if (names.Any(n => n.StartsWith("Z")))
    Console.WriteLine(names.First(n => n.StartsWith("Z")));
else
    Console.WriteLine("조건에 맞는 데이터 없음");

DB 조회 시 예외 방지: FirstOrDefault() 사용
필수 데이터 보장 로직: First() + try/catch 또는 Debug.Assert()
Null 가능성 주의: ?. 연산자 또는 null 병합(??)을 함께 사용

var user = users.FirstOrDefault(u => u.Id == id)?.Name ?? "Unknown";

 



#csharp #C# #csharpLINQ #csharpFirst #csharpFirstOrDefault #csharp예외처리 
#csharpList #csharpNullHandling #csharp베스트프랙티스 #csharp코딩규칙

728x90
반응형

댓글