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 |