본문 바로가기

C#

C# 레코드 타입 (Record)

1. 개념 설명

레코드는 기본적으로 참조형이지만 값 기반 동등성(value-based equality)을 제공하는 타입입니다. 생성자 매개변수나 init 접근자로 불변 모델을 쉽게 만들고, 자동으로 Equals/GetHashCode/ToString이 생성됩니다. 또한 with 식으로 일부 속성만 바꾼 복사본을 만들 수 있어 DTO, 상태 스냅샷에 적합합니다. 필요 시 값 형식인 record struct도 사용할 수 있습니다.

2. 코드 예제

다음 예제는 레코드의 값 비교, with 복사, 분해를 보여줍니다. 콘솔에 결과가 순서대로 출력됩니다.

public record Person(string Name, int Age);

var p1 = new Person("Kim", 30);
var p2 = new Person("Kim", 30);
Console.WriteLine(p1 == p2);           // True: 값 기반 동등성

var p3 = p1 with { Age = 31 };          // 불변 객체의 비파괴적 복사
Console.WriteLine(p3);                   // Person { Name = Kim, Age = 31 }

var (name, age) = p3;                    // 분해(Deconstruct)
Console.WriteLine($"{name}-{age}");     // Kim-31

동일한 데이터의 p1과 p2는 값이 같으므로 True가 출력됩니다. with로 만든 p3는 나이만 변경된 복사본이며, 자동 생성된 ToString이 읽기 좋은 형식으로 출력됩니다.

3. 주의사항/팁

레코드는 기본이 참조형(record class)이므로 동일 참조 비교는 ReferenceEquals로 확인해야 합니다. 성능이 민감한 경우에는 record struct를 검토하되, 큰 데이터를 복사할 때의 비용을 주의하세요. 변경이 필요한 필드는 init로 제한하고 불변 설계를 유지해야 with의 장점이 극대화됩니다. 직렬화/ORM 사용 시 자동 생성 멤버와의 호환성을 사전에 확인하는 것이 안전합니다.

'C#' 카테고리의 다른 글

C# 제네릭 (Generics) 기초  (0) 2026.03.31
C# Nullable 참조 타입  (0) 2026.03.30
C# 패턴 매칭 (Pattern Matching)  (0) 2026.03.26
C# 비동기 프로그래밍 async/await  (0) 2026.03.26
C# LINQ 기초 - Where, Select, OrderBy  (0) 2026.03.26