โ ํํ (Tuple)
ํํ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ์ ์งํฉ์ผ๋ก, ์ฌ๋ฌ ๊ฐ์ ํ๋๋ก ๋ฌถ์ด ๊ด๋ฆฌํ ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ค.
โ ๊ณ ์ ์ ์ธ ํํ (Class-based Tuple)
C# 4.0์์ ๋์ ๋ ํด๋์ค ๊ธฐ๋ฐ์ ํํ๋ก ๋ถ๋ณ(Immutable)ํ๋ฉฐ ๊ฐ์ ์ค์ ํ ํ ๋ณ๊ฒฝํ ์ ์๋ค. ํํ์ ๊ฐ ์์์ ์ ๊ทผํ๊ธฐ ์ํด Item1, Item2 ๋ฑ ์ด๋ฆ์ด ์ง์ ๋ ์์ฑ์ ์ฌ์ฉํ๋ค. ๊ฐ ํ์ (struct)์ด ์๋ ์ฐธ์กฐ ํ์ (class)์ด๊ธฐ ๋๋ฌธ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค.
// ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํํ ์์ฑ (๋ช
์์ ์ผ๋ก ํ์
์ ์์ฑํด์ผ ํ๋ค)
var tuple = new Tuple<int, string, bool>(1, "Hello", true);
// ํํ ์์์ ์ ๊ทผ
Console.WriteLine(tuple.Item1); // ์ถ๋ ฅ: 1
Console.WriteLine(tuple.Item2); // ์ถ๋ ฅ: Hello
Console.WriteLine(tuple.Item3); // ์ถ๋ ฅ: True
โ ๊ฐ ํํ (ValueTuple)
C# 7.0์์ ๋์ ๋ ๊ฐ ํ์ ์ ํํ๋ก ๊ฐ ์์์ ์ด๋ฆ์ ์ง์ ํ ์ ์์ผ๋ฉฐ ๊ฐ๋ณ(Mutable) ๊ตฌ์กฐ๋ก ์ ์ธ ํ์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค. ๊ฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค → ๊ตฌ์กฐ์ฒด ํ์ ์ด๋ฏ๋ก ์ ๋ฌํ ๋ ๋ง๋ค ๋ณต์ฌ๊ฐ ๋ฐ์ํ๋ค.
// ๊ฐ ํํ์ ์ฌ์ฉํ ์์
var valueTuple = (1, "Hello", true);
// ์์์ ์ ๊ทผ
Console.WriteLine(valueTuple.Item1); // ์ถ๋ ฅ: 1
Console.WriteLine(valueTuple.Item2); // ์ถ๋ ฅ: Hello
Console.WriteLine(valueTuple.Item3); // ์ถ๋ ฅ: True
// ์ด๋ฆ์ ์ง์ ํ ๊ฐ ํํ
var namedTuple = (Id: 1, Message: "Hello", IsActive: true);
// ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์์์ ์ ๊ทผ
Console.WriteLine(namedTuple.Id); // ์ถ๋ ฅ: 1
Console.WriteLine(namedTuple.Message); // ์ถ๋ ฅ: Hello
Console.WriteLine(namedTuple.IsActive); // ์ถ๋ ฅ: True
// ๊ฐ ๋ณ๊ฒฝ
namedTuple.Message = "World";
Console.WriteLine(namedTuple.Message); // ์ถ๋ ฅ: World
โ ์ฌ์ฉ ์์
- ์ฌ๋ฌ ๊ฐ ๋ฐํ
public (int Id, string Name, bool IsActive) GetPerson()
{
return (1, "Alice", true);
}
- ์ต๋ช ํ์ ๋์ ์ฌ์ฉ
var anonymous = new { Id = 1, Name = "Alice" }; // ์ต๋ช
ํ์
์ ๋ฉ์๋ ๋ฐ์ผ๋ก ์ ๋ฌํ๊ธฐ ์ด๋ ค์
var tuple = (Id: 1, Name: "Alice"); // ํํ์ ๋ฉ์๋ ๋ฐ์ผ๋ก ์ฝ๊ฒ ์ ๋ฌ ๊ฐ๋ฅ
โ ๋ ์ฝ๋ (Record)
C# 9.0์์ ๋์ ๋ ์ฐธ์กฐ ํ์ ์ผ๋ก, ์ฃผ๋ก ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๊ฐํธํ๊ฒ ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ ์ฝ๋๋ ๋ฐ์ดํฐ ์ค์ฌ์ ๊ฐ์ฒด๋ฅผ ํํํ๋ ๋ฐ ์ ํฉํ๋ฉฐ, ํนํ ์ฌ๋ฌ ์์ฑ์ ๊ฐ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด๋ DTO(Data Transfer Object)์ ๊ฐ์ ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉ๋๋ค.
โ ์ฃผ์ ํน์ง
- ๋ถ๋ณ์ฑ(Immutability) : ๊ฐ์ฒด ์์ฑ ํ์๋ ์์ฑ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค. (๋จ, init ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์์ฑ ์์ ์ ํ ๋ฒ๋ง ๊ฐ์ ์ค์ ํ ์ ์๋ค)
- ๊ฐ ๋น๊ต(Value Equality) : ๋ ๋ ์ฝ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ ๊ฐ์ ๊ฐ์ง๋ฉด, ๋ ๊ฐ์ฒด๋ ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ค.
โ ์ ์ ๋ฐ ์ฌ์ฉ
- ๋ ์ฝ๋ ์ ์
public record Person(string Name, int Age);
- ์์ฑ ์ ์์ init ์ ๊ทผ์
public record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
* init ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์์ฑ ์์๋ง ์์ฑ ๊ฐ์ ์ค์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ ์กฐ์
var person1 = new Person("Alice", 30);
var person2 = person1 with { Age = 31 };
Console.WriteLine(person1); // ์ถ๋ ฅ: Person { Name = Alice, Age = 30 }
Console.WriteLine(person2); // ์ถ๋ ฅ: Person { Name = Alice, Age = 31 }
* ๋ ์ฝ๋๋ ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ with ์์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ฉด์ ์ผ๋ถ ์์ฑ๋ง ๋ณ๊ฒฝํ ์ ์๋ค.
โ ์ฐจ์ด์
- ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ : ํํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋ณ(Mutable)์ ์ด๊ณ ๋ ์ฝ๋๋ ๋ถ๋ณ(Immutable)์ ์ด๋ค.
- ํ์ : ํํ(* Value Tuple)์ ๊ฐ ํ์ ์ผ๋ก ์คํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๊ณ ๋ ์ฝ๋๋ ์ฐธ์กฐ ํ์ ์ผ๋ก ํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค.
- ์์ : ํํ์ ์์์ ์ง์ํ์ง ์๊ณ ๋ ์ฝ๋๋ ์์์ ์ง์ํ๋ค.
'๐ C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋คํ์ฑ(Polymorphism), ๋ฐํ์ ๋คํ์ฑ, ์ปดํ์ผ ํ์ ๋คํ์ฑ (0) | 2024.08.20 |
|---|---|
| ์ถ์ ํด๋์ค(Abstract Class), ์ธํฐํ์ด์ค(Interface) (0) | 2024.08.20 |
| ๋ฆฌํ๋ ์ (Reflection) (0) | 2024.08.19 |
| const, readonly (0) | 2024.08.19 |
| in, out, ref ํค์๋ (0) | 2024.08.19 |