33. ValueTuple vs Tuple: 값 의미론·가변성·상등·이름 소거
난이도 중 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C#
// 주제: ValueTuple(값 튜플) vs Tuple(참조 튜플) — 값 의미론·가변성·분해·상등·이름 소거
//
// C# 7 의 (int, int) 튜플 구문은 System.ValueTuple(값 형식) 이고, 예전
// Tuple<int,int> 는 참조 형식이다. 둘의 복사·수정·상등·이름 처리 차이를 예측·설명한다.
//
// 과제:
// 1) Main 의 각 출력이 무엇이 될지 순서대로 예측하라.
// 2) ValueTuple 이 "가변(mutable) struct" 라는 점이 (2)에서 왜 복사 독립성으로,
// (3)에서 왜 필드 직접 수정으로 나타나는지 설명하라.
// 3) 튜플 요소 이름(a, b 등)이 런타임에 어떻게 처리되는지, (5)의 상등 결과와 연결하라.
// 4) ValueTuple 을 object 로 담을 때(박싱)와 Tuple(참조형)의 힙 할당 차이를 논하라.
// 내부 동작 설명은 answer.md 에서 다룬다.
using System;
public static class Program
{
public static void Main()
{
// (1) 분해(deconstruction)
var (x, y) = GetSpawn();
Console.WriteLine($"A x={x} y={y}");
// (2) 값 복사 독립성
var a = (hp: 10, mp: 5);
var b = a; // 값 복사
b.hp = 999;
Console.WriteLine($"B a.hp={a.hp} b.hp={b.hp}");
// (3) 가변 struct: 필드 직접 수정
a.mp = 42;
Console.WriteLine($"C a=({a.hp},{a.mp})");
// (4) ValueTuple 상등(== 및 Equals, 요소별 비교)
var p = (1, 2);
var q = (1, 2);
Console.WriteLine($"D {p == q} {p.Equals(q)}");
// (5) 요소 이름이 달라도 같은가?
(int first, int second) named1 = (1, 2);
(int left, int right) named2 = (1, 2);
Console.WriteLine($"E {named1.Equals(named2)}");
// (6) 참조형 Tuple 의 상등
var t1 = Tuple.Create(1, 2);
var t2 = Tuple.Create(1, 2);
Console.WriteLine($"F {t1.Equals(t2)} {ReferenceEquals(t1, t2)}");
}
static (int, int) GetSpawn() => (3, 4);
} 내 리뷰 · C#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.