C# - ๊ฐํ(Value Type)๊ณผ ์ฐธ์กฐํ(Reference Type) ๊ทธ๋ฆฌ๊ณ ๋ฐ์ฑ(Boxing) & ์ธ๋ฐ์ฑ(Unboxing)
๐ฆ ๊ฐํ๊ณผ ์ฐธ์กฐํ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ ์์ ์ ๋ณตํ๊ธฐ!
์ด๋ฒ์ C#์ ๊ณต๋ถํ๋ฉด์ ํท๊ฐ๋ฆฌ๊ธฐ ์ฌ์ด ๊ฐ๋
์ค ํ๋์ธ
**๊ฐํ(Value Type)**๊ณผ ์ฐธ์กฐํ(Reference Type), ๊ทธ๋ฆฌ๊ณ
๊ทธ ์ฌ์ด์์ ์๋ค๊ฐ๋ค ํ๋ ๋ฐ์ฑ(Boxing)๊ณผ ์ธ๋ฐ์ฑ(Unboxing) ๊ฐ๋
์ ์ ๋ฆฌํด๋ดค๋ค.
์ฒ์์๋ ๊ทธ๋ฅ ๊ฐ์ด๋ ์ฐธ์กฐ๋ ํ๊ณ ๋๊ฒผ๋๋ฐ,
์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ป๊ฒ ์ ์ฅ๋๊ณ ์ ๋ฌ๋๋์ง๋ฅผ ์ดํดํ๋๊น
์ ์ค์ํ์ง ํ์คํ ๋๊ปด์ก๋ค!
โ ๊ฐํ(Value Type)์ด๋?
๊ฐ์ "๊ทธ ์์ฒด"๋ก ์ ์ฅํ๋ ํ์
- ๋ณ์์ ๊ฐ์ด ์ง์ ์ ์ฅ๋จ
- ๋ค๋ฅธ ๋ณ์์ ๋ณต์ฌํ ๋ ๊ฐ์ด ๊ทธ๋๋ก ๋ณต์ฌ๋จ
- ๋ํ์ ์ธ ์: int, float, bool, char, struct ๋ฑ
int a = 10;
int b = a;
b = 20;
Console.WriteLine(a); // 10
a์ b๋ ์์ ํ ๋ค๋ฅธ ๊ณต๊ฐ์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ์ง๋ค. ํ๋ ๋ฐ๊ฟจ๋ค๊ณ ๋ค๋ฅธ ๊ฒ ๋ฐ๋์ง ์์!
โ ์ฐธ์กฐํ(Reference Type)์ด๋?
๊ฐ์ "์ด๋ ์๋์ง(์ฃผ์)"๋ก ์ ์ฅํ๋ ํ์
- ๋ณ์์ **๊ฐ์ด ์๋ ์์น(์ฐธ์กฐ)**๊ฐ ์ ์ฅ๋จ
- ๋ค๋ฅธ ๋ณ์์ ๋ณต์ฌํ๋ฉด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋จ
- ๋ํ์ ์ธ ์: class, array, string, object, interface ๋ฑ
int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 99;
Console.WriteLine(arr1[0]); // 99
arr1๊ณผ arr2๋ ๊ฐ์ ๋ฐฐ์ด์ ์ฐธ์กฐํ๊ณ ์์ด์, ํ๋๋ฅผ ๋ฐ๊พธ๋ฉด ๋ ๋ค ๋ฐ๋๋ค!
โ ๊ฐํ๊ณผ ์ฐธ์กฐํ์ ์ฐจ์ด
๊ตฌ๋ถ | ๊ฐํ(Value Type) | ์ฐธ์กฐํ(Reference Type) |
์ ์ฅ ๋ฐฉ์ | ๊ฐ์ ์ง์ ์ ์ฅ | ์ฃผ์(์ฐธ์กฐ)๋ฅผ ์ ์ฅ |
๋ณต์ฌ ์ | ๊ฐ์ด ๋ณต์ฌ๋จ | ์ฐธ์กฐ๊ฐ ๋ณต์ฌ๋จ |
์ ์ฅ ์์น | ์คํ(Stack) | ํ(Heap) + ์ฐธ์กฐ๋ ์คํ |
๋ํ ํ์ | int, float, bool, struct | class, array, string |
๐งณ ๋ฐ์ฑ(Boxing)๊ณผ ์ธ๋ฐ์ฑ(Unboxing)์ด๋?
๐ฉ ๋ฐ์ฑ(Boxing)
๊ฐํ → ์ฐธ์กฐํ์ผ๋ก ๋ณํ
int num = 123;
object obj = num; // ๋ฐ์ฑ
- num์ ์คํ์ ์๋ ๊ฐํ์ธ๋ฐ,
- object๋ก ์ ์ฅ๋๋ฉด์ ํ์ ๋ณต์ฌ๋๊ณ ,
- ์ฐธ์กฐํ์ฒ๋ผ ๋ค๋ค์ง๊ฒ ๋๋ค.
๐ฅ ์ธ๋ฐ์ฑ(Unboxing)
์ฐธ์กฐํ → ๊ฐํ์ผ๋ก ๋ณํ
object obj = 123; // ๋ฐ์ฑ
int num = (int)obj; // ์ธ๋ฐ์ฑ
- ๋ค์ ๊ฐ์ ๊บผ๋ผ ๋๋ ๋ช ์์ ํ๋ณํ์ด ํ์ํ๋ค.
- ํ์ด ์๋ชป๋๋ฉด ๋ฐํ์ ์ค๋ฅ ๋ฐ์ํ๋ ์ฃผ์ํด์ผ ํ๋ค!
๐ ์์ : ๊ฐํ vs ์ฐธ์กฐํ + ๋ฐ์ฑ/์ธ๋ฐ์ฑ
int x = 10;
object boxed = x; // ๋ฐ์ฑ
int y = (int)boxed; // ์ธ๋ฐ์ฑ
Console.WriteLine($"x: {x}"); // 10
Console.WriteLine($"boxed: {boxed}"); // 10
Console.WriteLine($"y: {y}"); // 10
- ๋ฐ์ฑ๋ boxed๋ ํ์ ์ ์ฅ๋ object ํ์ ๊ฐ์ฒด
- ์ธ๋ฐ์ฑ๋ y๋ ๋ค์ ์คํ์ ์ ์ฅ๋ ๊ฐํ ํ์
โ ๏ธ ๋ฐ์ฑ/์ธ๋ฐ์ฑ ์ฃผ์ํ ์
- ์ฑ๋ฅ ์ ํ ๋ฐ์ ๊ฐ๋ฅ (ํ ํ ๋น + ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์)
- ํ๋ณํ ํ์, ์ค์ํ๋ฉด InvalidCastException
- ์์ฃผ ์ฐ๋ ๊ณณ: ArrayList, List<object>, ๋น๋ฐํ ์ปฌ๋ ์ ๋ฑ
๐ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ด๋ฒ ๊ฐ๋ ์ ์ ๋ง ๋์ ์ ๋ณด์ด์ง๋ง ์ค์ํ ๊ฐ๋ ์ด๋ผ๋ ๊ฑธ ๊นจ๋ฌ์๋ค.
๋จ์ํ ๋ณ์์ ๋ญ๊ฐ๋ฅผ ๋ฃ๊ณ ๊บผ๋ด๋ ๊ฒ ์๋๋ผ,
๊ทธ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ด๋์ ์๊ณ ,
๋ณต์ฌ๋๋์ง, ๊ณต์ ๋๋์ง, ๋น์ฉ์ด ์ผ๋ง๋ ๋๋์ง๊น์ง
๋ค ๊ณ ๋ คํด์ผ ๋ ํจ์จ์ ์ด๊ณ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฑธ ๋ฐฐ์ ๋ค!
'C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C# - Nullable ํ์ ๊ณผ null ์กฐ๊ฑด ์ฐ์ฐ์ (1) | 2025.07.09 |
---|---|
C# - ๋ธ๋ฆฌ๊ฒ์ดํธ์ ๋๋ค, ํจ์๋ ๋ณ์์ฒ๋ผ! + LINQ (5) | 2025.07.09 |
C# - ์์ธ์ฒ๋ฆฌ(Exception Handling) (0) | 2025.07.09 |
C# - ์ธํฐํ์ด์ค์ ์ด๊ฑฐํ (Interface, enum) (2) | 2025.07.09 |
C# - ์ฝ์ ๋ธ๋์ญ ๊ฒ์ & ์ฌ์ฉ๋๋ ์์ ๋ค (3) | 2025.07.09 |