๋ฐ˜์‘ํ˜•

๐Ÿ“ฆ ๊ฐ’ํ˜•๊ณผ ์ฐธ์กฐํ˜•, ๊ทธ๋ฆฌ๊ณ  ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ ์™„์ „ ์ •๋ณตํ•˜๊ธฐ!

์ด๋ฒˆ์—” 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>, ๋น„๋ฐ•ํ˜• ์ปฌ๋ ‰์…˜ ๋“ฑ

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ด๋ฒˆ ๊ฐœ๋…์€ ์ •๋ง ๋ˆˆ์— ์•ˆ ๋ณด์ด์ง€๋งŒ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋ผ๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.

๋‹จ์ˆœํžˆ ๋ณ€์ˆ˜์— ๋ญ”๊ฐ€๋ฅผ ๋„ฃ๊ณ  ๊บผ๋‚ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
๊ทธ ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋””์— ์žˆ๊ณ ,
๋ณต์‚ฌ๋๋Š”์ง€, ๊ณต์œ ๋˜๋Š”์ง€, ๋น„์šฉ์ด ์–ผ๋งˆ๋‚˜ ๋“œ๋Š”์ง€๊นŒ์ง€
๋‹ค ๊ณ ๋ คํ•ด์•ผ ๋” ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๋ฐฐ์› ๋‹ค!

๋ฐ˜์‘ํ˜•