record(C# 9+)는 주로 불변 데이터 운반체이면서 값 기반 동등성을 갖는 타입을 정의하는 간결한 방법입니다. 상용구(생성자, 동등성, ToString 등)를 자동 생성하여 DTO, 도메인 값, 데이터 모델링에 이상적입니다.
record 정의(위치 구문)
;
p1 = Person(, );
p1.Name;
Console.WriteLine(p1);
위치 구문 record Person(string Name, int Age)는 모든 것을 생성합니다 — 프로퍼티, 생성자, ToString, 동등성, 분해 — 일반 클래스가 필요로 하는 상용구를 없앱니다.
var a = new Person("Ann", 30);
var b = new Person("Ann", 30);
a == b; // TRUE — record는 값으로 비교(모든 프로퍼티가 같음)
// (일반 클래스라면 여기서 FALSE — 클래스는 참조로 비교)
클래스(참조 동일성으로 비교)와 달리 record는 값으로 비교합니다 — 프로퍼티 값이 같은 두 record는 동등합니다. 이는 데이터 객체에 바로 원하는 동작입니다.
public record Person(string Name, int Age); // 프로퍼티는 init 전용(불변)
var p1 = new Person("Ann", 30);
var p2 = p1 with { Age = 31 }; // `with`는 일부 프로퍼티를 바꾼 복사본을 만듦
// p1은 변하지 않음(불변); p2 = Person { Name = Ann, Age = 31 }
record는 기본적으로 불변이며, with 식은 수정된 복사본을 만듭니다(비파괴적 변경) — 불변 데이터를 다루는 데 이상적입니다.
public record class Ref(int X); // 값 동등성을 갖는 참조 타입(기본)
public record struct Val(int X); // 값 타입 record(C# 10)
record는 불변 데이터 타입을 간결하고 올바르게 정의하게 하는 중요한 현대 C# 기능(C# 9+)이므로, 현대 C# 개발에 이해할 가치가 있습니다.
핵심 이점은 실제 필요를 해결합니다. 상용구를 없애고(한 줄 선언으로 생성자, 프로퍼티, ToString, 동등성, 분해를 자동 생성 — 일반 클래스가 요구하는 상당한 코드 대비), 값 기반 동등성을 제공합니다(프로퍼티가 같은 두 record는 동등, 참조로 비교하는 클래스와 달리) — 이는 데이터 객체, DTO, 도메인 값에 바로 원하는 동작이며, 클래스는 기본적으로 이를 잘못 처리합니다.
record는 또한 기본적으로 불변이며 비파괴적 변경을 위한 우아한 with 식(수정된 복사본 생성)을 제공하여, 더 안전하고 예측 가능한 코드를 위해 점점 선호되는 불변, 함수형 스타일을 지원합니다.
record를 이해하는 것 — 간결한 구문, 값 동등성, with를 통한 불변성, record struct — 은 깔끔한 현대 C#을 작성하는 데 가치가 있습니다. record는 데이터를 모델링하는 관용적인 방법(DTO, API 모델, 값 객체, 불변 상태)이고 현재 코드베이스에서 널리 사용되기 때문입니다.
record(값 의미론을 갖는 불변 데이터)를 언제 사용하고 클래스(정체성과 풍부한 동작을 갖는 가변 객체)를 언제 사용할지 아는 것은 현대 C#에 대한 유창함을 반영합니다.
record는 데이터 모델링을 극적으로 단순화하면서 올바른 동등성과 불변성을 제공하므로 — 이전에는 번거롭고 오류가 나기 쉬웠던 흔한 필요 — 현대적이고 깔끔한 C# 코드의 특징인 중요하고 자주 사용되는 기능입니다.