๊ตฌ์กฐ์ฒด(Struct) => ํค์๋ : struct
์ฌ์ฉ
using System;
namespace StructEx
{
//๊ตฌ์กฐ์ฒด ์ ์ํ๊ธฐ
struct MyPoint
{
public int x;
public int y;
//**๊ตฌ์กฐ์ฒด๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๊ธฐ๋ณธ์์ฑ์๋ ์ ์ธํ ์ ์๋ค.
public MyPoint(int x, int y)
{
this.x = x;
this.y = y;
}
// ๋ชจ๋ ๊ตฌ์กฐ์ฒด๋ System.Object ํ์์ ์์ํ๋ System.ValueType์ผ๋ก ๋ถํฐ ์ง์ ์์๋ฐ์.
public override string ToString()
{
return string.Format($"{x} {y}");
}
}
class Program
{
static void Main(string[] args)
{
MyPoint myPoint;
myPoint.x = 100;
myPoint.y = 100;
Console.WriteLine($"{myPoint.ToString()}");
MyPoint myPoint2 = new MyPoint(1000, 1000);
MyPoint myPoint3 = myPoint2;
// ๊ตฌ์กฐ์ฒด๋ value type์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๊ฐ์ด heap๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ง ์์
// ์์๊ฐ์ด ๋ณต์ฌํด๋ ๊น์๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋ค.(Ref type์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ์์ฑํ๋ฉด ์์ ๋ณต์ฌ)
myPoint3.y = 1001;
Console.WriteLine(myPoint2.ToString());
Console.WriteLine(myPoint3.ToString());
}
}
}
Output
100 100
1000 1000
1000 1001
C#
์์๋ struct
๋ฅผ ์ฌ์ฉํ๋ฉด value type
์ ๋ง๋ค๊ณ , class
๋ฅผ ์ฌ์ฉํ๋ฉด reference type
์ ๋ง๋ ๋ค.
- int, double, float, bool ๊ณผ ๊ฐ์ type๋ค์
๊ธฐ๋ณธ(primitive) type
์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ฌํ ๊ธฐ๋ณธํ์
๋ค์
struct
๋ก ์ ์๋ type์ด๋ค. ์ฆ, value type
(๊ฐ ํ์)์ด๋ค.
Value Type
์ ์์ํ ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ฐ์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ค.
Reference Type
์ class
๋ฅผ ์ ์ํด์ ๋ง๋ค๊ณ , ์์์ด ๊ฐ๋ฅ
ํ๋ฉฐ, ์ข ๋ ๋ณต์กํ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ๋ค์ ์ ์ํ๋ ๊ณณ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
๊ตฌ์กฐ์ฒด(Struct)
: struct
๋ผ๋ ํค์๋๋ฅผ ์ด์ฉํด์ ์ ์ํ๋ค.
- ํด๋์ค์ ๊ฐ์ด ๋ฉ์๋๋ ์์ฑ(ํ๋กํผํฐ)๋ฑ ๊ฑฐ์ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ์์์ ํ ์๋ ์๋ค.
- ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํฐํ์ด์ค(interface) ๊ตฌํ์ ํ ์ ์๋ค.
MyPoint myPoint3 = myPoint2;
๊ตฌ์กฐ์ฒด๋ value type
์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๊ฐ์ด heap๋ฉ๋ชจ๋ฆฌ
์ ์ ์ฅ๋์ง ์์ ์์๊ฐ์ด ๋ณต์ฌํด๋ ๊น์๋ณต์ฌ
๊ฐ ์ด๋ฃจ์ด์ง๋ค.(reference type
์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ์์ฑํ๋ฉด ์์ ๋ณต์ฌ
๊ฐ ์ด๋ฃจ์ด์ง๋ค.)
ํํ(Tuple)
=> ํค์๋ : ()
์ฌ์ฉ
using System;
namespace TupleEx
{
class Program
{
static void Main(string[] args)
{
var aa = ("ํ๊ธธ๋", 40); //unnamed tuple
Console.WriteLine($"{aa.Item1}, { aa.Item2}");
var bb = (Name: "ํ๊ธธ๋ถ", Age: 55); //named tuple
Console.WriteLine($"{bb.Name}, {bb.Age}");
var (name, age) = bb; // ๊ฐ์๋ค๊ฐ ํํ์ ํ ๋นํ ์ ์๋ค. ๋จ, ํํ ๋ด ์์์ ๊ฐ์์ ๋ง์ถ๊ฒ.
Console.WriteLine($"{name}, {age}");
bb = aa; // ํํ์ Value Type์ด๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ด ๋ณต์ฌํด๋ ๊น์ ๋ณต์ฌ(Deep Copy)๊ฐ ์ด๋ฃจ์ด ์ง๋ค.
Console.WriteLine($"{bb.Name}, {bb.Age}");
}
}
}
Output
ํ๊ธธ๋, 40
ํ๊ธธ๋ถ, 55
ํ๊ธธ๋ถ, 55
ํ๊ธธ๋, 40
- C# 7.0 ์ด์ ๋ฒ์ ์์๋ ๋ฉ์๋์์ ํ๋์ ๊ฐ๋ง์ ๋ฐํํ ์ ์์์ง๋ง, ์ดํ ๋ฒ์ ์์๋ ํํ์ ์ด์ฉํด์ ๋ณต์ ๊ฐ์ ๊ฐ๋ค์ ๋ฆฌํดํ ์ ์๊ฒ ๋์๋ค.
- Tuple(ํํ) : ์ฌ๋ฌ๊ฐ์ ํ๋๋ฅผ ๋ด์ ์ ์๋ ๊ตฌ์กฐ์ฒด์ ๊ฐ๋ค. =>
()
๋ฅผ ์ด์ฉํ๋ค.
- ํํ์
()
์์ ์ฌ๋ฌ๊ฐ์ ํ๋๋ฅผ ์ง์ ํ์ฌ ๋ง๋ค ์ ์๋ค.
bb = aa;
- ํํ๋ Value Type์ด๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ํํ ๋ณต์ฌ๋ฅผ ํ์ฌ๋ ๊น์ ๋ณต์ฌ(Deep Copy)๊ฐ ์ด๋ฃจ์ด์ง๋ค.
ํํ ์ ์ธ
var t = (100, 200);
- ์ด์ฒ๋ผ ๋ด๋ถ ๋๊ฐ์ ๊ฐ์ด ์ด๋คํ๋์ธ์ง ์ด๋ฆ์ด ๋ช
์๋์ด ์์ง ์์ ํํ์
Unnamed Tuple
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
var t = (Name : "ํ๊ธธ๋", Id : "1111")
- ์ด์ฒ๋ผ ๋ด๋ถ ๊ฐ์ ์ด๋ฆ์ด ๋ช
์๋์ด ์๋ ํํ์
Named Tuple
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.