[C#] Record 란

C# 2023. 3. 28. 22:31
728x90

C# 9.0 부터 나온 개념으로 class와 유사하고 또 struct와도 유사한 타입입니다.

불변 객체로 값이 정의된 이후에는 변경이 불가능합니다.

아래처럼 간단하게 정의하여 사용이 가능합니다.

// 정의
public record PersonRecord(string? FirstName, string? LastName);

// 사용
var record = new PersonRecord("Kang", "Jun");

class는 object를 비교하지만

record는 비교 시 값을 비교하게 되므로 값 비교 시 유용하게 사용할 수 있습니다.

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();
    }
}

위 코드에서 알수 있듯이 class를 객체 자체를 비교하므로 동일하지 않습니다
또한 ToString() 시 class 명이 출력됩니다.

하지만 record 는 값을 비교하므로 동일한 것으로 판단합니다.
또한 ToString() 시 record 명 그리고 필드와 값이 모두 출력됩니다.

값 복사 또한 매우 간단합니다.

아래처럼 with 구문을 이용해 값을 복사할 수 있으며 특정 필드 값을 바꾸고 싶은 경우
변경할 필드와 값을 넣어주면 됩니다.

var thirdRecord = firstRecord with { LastName = "HanDam" };

값을 바꿨으므로 당연히 비교한 결과는 동일하지 않은 것으로 판단합니다.


참고

https://www.daveabrock.com/2020/07/06/c-sharp-9-deep-dive-records/

 

C# 9 Deep Dive: Records

In a C# 9 deep dive, we go in depth on records.

www.daveabrock.com

https://www.csharpstudy.com/Latest/CS9-record.aspx

 

C# 9 레코드 타입 - C# 프로그래밍 배우기 (Learn C# Programming)

C# 9.0: 레코드(record) 타입 C# 9.0 에서 가장 두드러진 변화는 record 타입을 새로 도입한 것이다. 지금까지의 C#/.NET에서는 struct를 사용하는 Value Type(값 타입)과 class를 사용하는 Reference Type(레퍼런스

www.csharpstudy.com

 

728x90
Posted by kjun.kr
,