(C#) 레코드 열

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