레코드의 with 식
변경 불가능한 객체의 수정된 복사본을 만듭니다.
레코드의 with 식은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
복사 식
with 식은 일부 속성을 변경한 레코드의 복사본을 만들고 원본은 그대로 둡니다. 변경 불가능한 레코드를 「업데이트」하는 관용적인 방법입니다.
using System;
record Point(int X, int Y);
var a = new Point(1, 2);
var b = a with { Y = 9 };
Console.WriteLine(a + " | " + b); // Point { X = 1, Y = 2 } | Point { X = 1, Y = 9 }비파괴적 변경
원본 레코드는 절대 수정되지 않습니다. with는 얕은 복사를 수행하고 나열된 변경 사항을 복사본에만 적용합니다.
using System;
record User(string Name, int Age);
var original = new User("Ada", 30);
var older = original with { Age = 31 };
Console.WriteLine(original.Age + " " + older.Age); // 30 31여러 속성 변경하기
중괄호 안에 여러 할당을 나열하면 한 번에 두 개 이상의 속성을 변경할 수 있습니다.
using System;
record Config(string Env, int Retries, bool Verbose);
var baseCfg = new Config("dev", 3, false);
var prod = baseCfg with { Env = "prod", Verbose = true };
Console.WriteLine(prod.Env + " " + prod.Retries + " " + prod.Verbose); // prod 3 True변경되지 않은 속성 복사
언급하지 않은 속성은 원본 레코드에서 그대로 복사됩니다.
using System;
record Product(string Name, decimal Price, int Stock);
var p = new Product("Book", 12m, 5);
var discounted = p with { Price = 10m };
Console.WriteLine(discounted.Name + " " + discounted.Stock); // Book 5<code>with</code>와 값 동일성
레코드는 값 동일성을 사용하므로 아무것도 변경하지 않은 복사본은 원본과 같습니다.
using System;
record Coord(int X, int Y);
var a = new Coord(1, 2);
var b = a with { };
Console.WriteLine(a == b); // True (value equal)
Console.WriteLine(ReferenceEquals(a, b)); // False (different objects)얕은 복사 의미
with는 깊은 객체 그래프가 아니라 참조를 복사합니다. 따라서 중첩된 변경 가능한 객체는 원본과 복사본에서 공유됩니다.
using System;
using System.Collections.Generic;
record Cart(List<string> Items);
var a = new Cart(new List<string> { "x" });
var b = a with { };
b.Items.Add("y"); // shared list!
Console.WriteLine(a.Items.Count); // 2레코드 구조체에서의 <code>with</code>
레코드 구조체도 with를 지원하며, 값 형식의 수정된 복사본을 생성합니다.
using System;
record struct Size(int W, int H);
var s = new Size(4, 4);
var wide = s with { W = 8 };
Console.WriteLine(wide.W + "x" + wide.H); // 8x4<code>with</code> 식 연결
with 식을 연결하여 일련의 변경을 적용할 수 있으며, 각 식은 새 레코드를 생성합니다.
using System;
record Point(int X, int Y, int Z);
var p = new Point(0, 0, 0)
with { X = 1 }
with { Y = 2 }
with { Z = 3 };
Console.WriteLine(p); // Point { X = 1, Y = 2, Z = 3 }빌더 없는 업데이트
with를 사용하면 빌더 클래스를 만들 필요가 없습니다. 원하는 필드만 복사한 다음 수정하면 됩니다.
using System;
record Email(string To, string Subject, string Body);
var draft = new Email("a@b.com", "Hi", "");
var ready = draft with { Body = "Welcome!" };
Console.WriteLine(ready.Body); // Welcome!사용자 지정 복사 로직
레코드는 with가 사용하는 보호된 복사 생성자를 생성합니다. 복사 방식을 사용자 지정하려면 직접 선언할 수 있습니다.
using System;
record Audited(string Name) {
public int Version { get; init; } = 1;
protected Audited(Audited other) {
Name = other.Name;
Version = other.Version + 1; // bump on every copy
}
}
var a = new Audited("x");
var b = a with { };
Console.WriteLine(a.Version + " " + b.Version); // 1 2종합하기
with로 상태 전환을 모델링하면 감사 추적에 유리한 변경 불가능한 기록을 유지할 수 있습니다.
using System;
record Order(string Id, string Status);
var created = new Order("O1", "Created");
var paid = created with { Status = "Paid" };
var shipped = paid with { Status = "Shipped" };
Console.WriteLine(created.Status + " -> " + paid.Status + " -> " + shipped.Status);빠른 확인
with 식에 대한 이해도를 확인해 보십시오.
복습
레코드의 with 식을 배웠습니다.
a with { Prop = value }는 선택한 속성을 복사하고 변경합니다.- 원본은 절대 변경되지 않으므로 비파괴적입니다.
- 복사는 얕은 복사이므로 중첩된 변경 가능한 객체가 공유됩니다.
- 레코드와 레코드 구조체에서 사용할 수 있으며 연결도 가능합니다.
자주 묻는 질문
“레코드의 with 식” 강의는 무료인가요?
네 — “레코드의 with 식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“레코드의 with 식”에서 뭘 배우나요?
변경 불가능한 객체의 수정된 복사본을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“레코드의 with 식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- init 전용 setter
- required 한정자
- 변경 불가능한 객체 패턴
- 레코드의 with 식