C#9의 개념으로 클래스와 유사하고 구조체와도 유사한 유형입니다.
불변 객체로서 한번 정의된 값은 변경할 수 없습니다.
아래와 같이 쉽게 정의하여 사용할 수 있습니다.
// 정의
public record PersonRecord(string? FirstName, string? LastName);
// 사용
var record = new PersonRecord("Kang", "Jun");
클래스는 객체를 비교합니다.
레코드는 비교할 때 값을 비교하므로 값을 비교할 때 유용할 수 있습니다.
public record PersonRecord(string? FirstName, string? LastName);
public class PersonClass
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
}
class Program
{
static void Main(string() args)
{
// class compare
var firstObj = new PersonClass() { FirstName = "Kang", LastName = "Jun" };
var secondObj = new PersonClass() { FirstName = "Kang", LastName = "Jun" };
var classComparison = firstObj == secondObj ? "EQUAL" : "NOT EQUAL";
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
Console.WriteLine($"CLASS-1 : {firstObj.ToString()}");
Console.WriteLine($"CLASS-2 : {secondObj.ToString()}");
Console.WriteLine($"Classes: {classComparison}");
Console.WriteLine();
Console.WriteLine("----------------------------------------------------");
// record compare
var firstRecord = new PersonRecord("Kang", "Jun");
var secondRecord = new PersonRecord("Kang", "Jun");
var compareResult = firstRecord == secondRecord ? "EQUAL" : "NOT EQUAL";
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
Console.WriteLine($"RECORD-1 : {firstRecord.ToString()}");
Console.WriteLine($"RECORD-2 : {secondRecord.ToString()}");
Console.WriteLine($"RECORDS: {compareResult}");
Console.WriteLine();
// record 값 복사
var thirdRecord = firstRecord with { LastName = "HanDam" };
var compareResult2 = firstRecord == thirdRecord ? "EQUAL" : "NOT EQUAL";
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
Console.WriteLine($"RECORD-1 : {firstRecord.ToString()}");
Console.WriteLine($"RECORD-3 : {thirdRecord.ToString()}");
Console.WriteLine($"RECORDS: {compareResult2}");
Console.WriteLine();
}
}
위의 코드에서 볼 수 있듯이 클래스는 개체 자체를 비교하므로 동일하지 않습니다.
또한 클래스 이름은 ToString()으로 출력됩니다.

그러나 데이터 세트는 값을 비교하여 동일함을 찾습니다.
또한 ToString()을 사용하면 레코드 이름, 필드 및 값이 출력됩니다.

값 복사도 매우 쉽습니다.
아래와 같이 with 문을 사용하여 값을 복사할 수 있으며 특정 필드 값을 변경하려는 경우
변경할 필드와 값을 입력하기만 하면 됩니다.
var thirdRecord = firstRecord with { LastName = "HanDam" };
물론 값이 바뀌었기 때문에 비교 결과가 같지 않은 것으로 판단된다.

참조
https://www.daveabrock.com/2020/07/06/c-sharp-9-deep-dive-records/
C# 9 심층 분석: 레코드
C# 9 Deep Dive에서는 레코드에 대해 자세히 알아봅니다.
www.daveabrock.com
https://www.csharpstudy.com/Latest/CS9-record.aspx
C# 9 레코드 유형 – C# 프로그래밍 배우기
C# 9.0: 레코드 유형 C# 9.0에서 가장 눈에 띄는 변화는 새로운 레코드 유형의 도입입니다. C#/.NET에서 지금까지 구조체를 사용하는 값 유형 및 클래스를 사용하는 참조 유형
www.csharpstudy.com