๊ด€๋ฆฌ ๋ฉ”๋‰ด

Algo ์“ฐ์ž

12. ๊ตฌ์กฐ์ฒด & ํŠœํ”Œ ๋ณธ๋ฌธ

๐Ÿ’ป Programming Language/C#

12. ๊ตฌ์กฐ์ฒด & ํŠœํ”Œ

S.Honey 2022. 4. 6. 09:25

๊ตฌ์กฐ์ฒด(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 ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.