C#/์ด๊ฒƒ์ด C#์ด๋‹ค

42. [ํด๋ž˜์Šค/๋ ˆ์ฝ”๋“œ]๋กœ ๋ถˆ๋ณ€๊ฐ์ฒด ๊ตฌํ˜„ํ•˜๊ธฐ

Rainbow๐ŸŒˆCoder 2022. 2. 23. 11:38
728x90

*๋ ˆ์ฝ”๋“œ ํŒŒํŠธ์ด์ง€๋งŒ C# 9.0 ์ด์ƒ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ฐœ๋…์ด๋ผ ๋ณธ ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ”๋งŒ ๊ธฐ๋ก ๋‚จ๊ธฐ๊ธฐ๋กœ ๊ฒฐ์ •*

 

๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ์ƒํƒœ(๋ฐ์ดํ„ฐ)๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

 

์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€ ๊ฐ์ฒด์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ์™€ ๋น„๊ต๊ฐ€ ๋งŽ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๋ ค๊ณ  (1)๊ธฐ์กด ์ƒํƒœ๋ฅผ ๋ณต์‚ฌํ•œ ๋’ค,
์ด ์ค‘(2) ์ผ๋ถ€๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ ,

(3) ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ๋‚ด์šฉ์„ ์ž์ฃผ ๋น„๊ตํ•œ๋‹ค.

 

(๋ ˆ์ฝ”๋“œ๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ด๋ค„์ง€๋Š” ์ด ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก C# 9.0์—์„œ ๋„์ž…๋œ ํ˜•์‹์ด๋‹ค.)

 

์ฐธ์กฐ ํ˜•์‹์€ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ readonly๋กœ ์„ ์–ธํ•˜๋ฉด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ฐ’ ํ˜•์‹์€ readonly struct๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ํ•„๋“œ๋ฅผ readonly๋กœ ์„ ์–ธํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ฐ’ ํ˜•์‹ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์— ํ• ๋‹นํ•  ๋•Œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊นŠ์€ ๋ณต์‚ฌ๋ž€ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ƒˆ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ํ•„๋“œ์— 1:1๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. 

ํ•„๋“œ๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ๋ณต์‚ฌ ๋น„์šฉ์€ ์ปค์ง„๋‹ค.(๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—” ๋” ์ปค์ง„๋‹ค.)

์ฐธ์กฐ ํ˜•์‹์€ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋‹ค. (๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ๋ณต์‚ฌํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ)

๋‹ค๋งŒ, ์ฐธ์กฐ ํ˜•์‹์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ๋œ๋‹ค.

 

๊ฐ’ ํ˜•์‹์€ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋–„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๋Š”๋ฐ ๋ชจ๋“  ํ•„๋“œ๋ฅผ 1:1๋กœ ๋น„๊ตํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ฐธ์กฐ ํ˜•์‹๋ผ๋ฆฌ ๋‚ด์šฉ ๋น„๊ต๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๋น„๊ต ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

[๋ณดํ†ต์€ object๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•˜๋Š” Equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ๋‹ค.]

 

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ˜•์‹์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ธ์ˆ˜๋‚˜ ์ปฌ๋ ‰์…˜ ์š”์†Œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ

๋ณต์‚ฌ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ•œํŽธ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์ƒˆ ์ƒํƒœ ํ‘œํ˜„๊ณผ ์ƒํƒœ ํ™•์ธ์„ ์œ„ํ•ด ๊นŠ์€ ๋ณต์‚ฌ์™€ ๋‚ด์šฉ ๋น„๊ต๊ฐ€ ํ•„์ˆ˜์ ์ด๋ฏ€๋กœ ๊ฐ’ ํ˜•์‹์œผ๋กœ ์„ ์–ธํ•˜๋Š” ํŽธ์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ๋Š” ํŽธ๋ฆฌํ•œ ๋ถ€๋ถ„์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค.

๋ถˆ๋ณ€ ์ฐธ์กฐ ํ˜•์‹์˜ ๋น„์šฉ ํšจ์œจ๊ณผ ๋ถˆ๋ณ€ ๊ฐ’ ํ˜•์‹์˜ ํŽธ๋ฆฌํ•จ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ๋А ๋ฐฉ๋ฒ•์ด...๋ ˆ์ฝ”๋“œ ํ˜•์‹์ด๋‹ค. ^^

 

 

๋ ˆ์ฝ”๋“œ ํ˜•์‹์€ ๊ฐ’ ํ˜•์‹์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋ถˆ๋ณ€ ์ฐธ์กฐ ํ˜•์‹์œผ๋กœ,

์ฐธ์กฐ ํ˜•์‹์˜ ๋น„์šฉ ํšจ์œจ๊ณผ ๊ฐ’ ํ˜•์‹์ด ์ฃผ๋Š” ํŽธ๋ฆฌํ•จ์„ ๋ชจ๋‘ ์ œ๊ณตํ•œ๋‹ค.

 

<๋ ˆ์ฝ”๋“œ ์„ ์–ธ>

๋ ˆ์ฝ”๋“œ๋Š” record ํ‚ค์›Œ๋“œ์™€ ์ดˆ๊ธฐํ™” ์ „์šฉ ์ž๋™ ๊ตฌํ˜„ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•จ๊ป˜ ์ด์šฉํ•ด์„œ ์„ ์–ธํ•œ๋‹ค.

 

record RTransaction

{

     public string From     {get; init;}

     public string To         {get; init;}

     public string Amount {get; init;}

}

 

RTransaction tr1 = new RTransaction{From="Alice", To="Bob",Amount=100};

RTransaction tr2 = new RTransaction{From="Bob", To="Charlie", Amount = 300};

 

์œ„์™€ ๊ฐ™์ด ์„ ์–ธํ•œ ๋ ˆ์ฝ”๋“œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

 

<with ํ‚ค์›Œ๋“œ ํ™œ์šฉ>

๋‹น์žฅ์€ ํ™œ์šฉ ์—ฌ์ง€๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ, ๊ธฐ๋ก ์ƒ๋žต-!

 

<๋ ˆ์ฝ”๋“œ ๊ฐ์ฒด ๋น„๊ตํ•˜๊ธฐ>

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ ˆ์ฝ”๋“œ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” Equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

-ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒํƒœ ๋น„๊ต๋ฅผ ์œ„ํ•œ Equals() ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์˜ˆ์ œ

class CTransaction

{

     public string From     {get; init;}

     public string To        {get; init;}

     public int     Amount {get; init;}

 

     public override bool Equals(Object obj)

     {

         CTransaction target = ()obj;

         if(this.From == target.From && this.To == target.To && this.Amount == target.Amount)

                  return true;

         else    return false;

 

     }

}

Equals()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” CTransaction์˜ ์ธ์Šคํ„ด์Šค ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๋•Œ,

์ด ๋‘˜์„ ๋น„๊ตํ•˜๋ฉด ์ฐธ(True)์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

 

- ํ‰๋ฒ”ํ•œ ๋ ˆ์ฝ”๋“œ ์„ ์–ธ์˜ˆ์ œ(๋ ˆ์ฝ”๋“œ๋Š” ์ฐธ์กฐํ˜•์‹์ด์ง€๋งŒ ๊ฐ’ ํ˜•์‹์ฒ˜๋Ÿผ Equals() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค)

record CTransaction

{

     public string From     {get; init;}

     public string To        {get; init;}

     public int     Amount {get; init;}

}

 

 

<์˜ˆ์ œ> ํด๋ž˜์Šค๋กœ ๋ถˆ๋ณ€ ๊ฐ์ฒด ๊ตฌํ˜„ํ•˜๊ธฐ...์ด๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๊ทธ๋งˆ์ €๋„ ํ˜„์žฌ ๋‚˜์˜C# ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „ ์ˆ˜์ค€์ด ๋‚ฎ์€ ๊ด€๊ณ„์ƒ

ํ”„๋กœํผํ‹ฐ Init ๋Œ€์‹  set์œผ๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค..

Equals ๋น„๊ต ์—ฐ์‚ฐ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ณ  ํ˜ธ์ถœํ•ด๋ณด๋Š” ๊ฒƒ์„ ํ•œ๋ฒˆ ๊ตฌ๋™ํ•ด๋ดค๋‹ค๋Š”๋ฐ ์˜์˜๋ฅผ ๋‘๊ธฐ๋กœ..

using System;

namespace Record
{
    class CTransaction 
    {
        public string From{ get; set; }
        public string To { get; set; }
        public int Amount { get; set; }
        public override string ToString()
        {
            return $"{From,-10} -> {To,-10} : ${Amount}";
        }
        public override bool Equals(object obj)
        {
            CTransaction target = (CTransaction)obj;
            if(this.From == target.From && this.To == target.To && this.Amount == target.Amount) return true;
            else return false;
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            CTransaction tr1 = new CTransaction { From="Alice", To="Bob",Amount=100 };
            CTransaction tr2 = new CTransaction { From = "Bob", To = "Charlie", Amount = 50 };

            Console.WriteLine(tr1);
            Console.WriteLine(tr2);
            Console.WriteLine($"tr1 equals to tr2 : {tr1.Equals(tr2)}");

            CTransaction tr3 = new CTransaction { From = "Charlie", To = "Alice", Amount = 50 };
            CTransaction tr4 = new CTransaction { From = "Charlie", To = "Alice", Amount = 50 };
            Console.WriteLine($"tr3 equals to tr4 : {tr3.Equals(tr4)}");

        }
    }
}

 

<์ถœ๋ ฅ ๊ฒฐ๊ณผ>

Alice      -> Bob        : $100
Bob        -> Charlie    : $50
tr1 equals to tr2 : False
tr3 equals to tr4 : True
728x90