with 식을 이용한 레코드 복사, 프로퍼티 값 변경

00·2024년 12월 20일

C#

목록 보기
34/149

using System;

/
with 식을 이용한 레코드 복사:
with 식을 사용하면 레코드 객체의 일부 프로퍼티(속성) 값만 변경하면서 새로운 객체를 쉽게 생성할 수 있습니다.
이는 불변 객체를 다룰 때 유용하게 사용할 수 있습니다.
/

/*
클래스 vs 프로퍼티 vs 레코드?

1) 클래스: 객체를 만들기 위한 설계도 또는 틀입니다. 클래스는 객체의 속성(프로퍼티)과 메서드를 정의합니다.
2) 프로퍼티: 객체의 데이터에 접근하고 수정하기 위한 방법을 제공하는 클래스의 멤버입니다.
프로퍼티는 get 접근자와 set 접근자를 사용하여 구현됩니다.
3) 레코드: 클래스의 일종입니다. C# 9.0에서 도입된 레코드는 불변성을 기본적으로 지원하는 참조 형식입니다.
즉, 레코드는 불변성을 지원하는 특수한 클래스.
레코드는 클래스와 마찬가지로 속성과 메서드를 가질 수 있습니다.
*/

// with 식을 사용하여 레코드 객체를 복사하고 일부 속성 값을 변경하는 방법
namespace System.Runtime.CompilerServices
{
public class IsExternalInit { }
}

namespace WithExp
{

// RTransaction 레코드는 거래 정보를 나타내는 레코드
// From, To, Amount 속성은 init 접근자를 사용했으므로, 초기화 전용 자동 구현 속성으로 선언됨
record RTransaction 
{
    public string From { get; init; }
    public string To { get; init; }
    public int Amount { get; init; }

    public override string ToString()
    {
        return $"{From,-10} -> {To,-10} : ${Amount}";
    }
}


class MainApp
{
    static void Main(string[] args)
    {
        RTransaction tr1 = new RTransaction { From = "Alice", To = "Bob", Amount = 100 }; // RTransaction 레코드의 객체 tr1을 생성

        RTransaction tr2 = tr1 with { To = "Charlie" }; // with 식을 사용하여 tr1 객체를 복사하고,
                                                        // To 프로퍼티 값만 "Charlie"로 수정해서 tr2라는 새로운 레코드 객체를 생성함

        RTransaction tr3 = tr2 with { From = "Dave", Amount = 30 }; // tr2 객체를 복사하고
                                                                    // From 속성 값을 "Dave"로, Amount 속성 값을 30으로 변경한
                                                                    // tr3이라는 새로운 객체를 생성

        Console.WriteLine(tr1);
        Console.WriteLine(tr2);
        Console.WriteLine(tr3);
    }
}

}

/*
출력 결과

Alice -> Bob : $100
Alice -> Charlie : $100
Dave -> Charlie : $30
*/

0개의 댓글