๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ/C#

[C#] ๋ ˆ์ฝ”๋“œ์™€ ํ”„๋กœํผํ‹ฐ

by HanaV 2023. 8. 18.
728x90

๋ ˆ์ฝ”๋“œ

๋ ˆ์ฝ”๋“œ๋Š” ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ถˆ๋ณ€์„ฑ(immutable)์„ ์œ ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ๋ ˆ์ฝ”๋“œ์˜ ํ•„๋“œ๋Š” ์ดˆ๊ธฐํ™” ํ›„์—๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.
readonly๋„ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. readonly๋Š” ํ•„๋“œ๋Š” ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์„ ์–ธํ•œ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ , ํ• ๋‹น ํ›„์—๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ถˆ๋ณ€ ํ•„๋“œ์ด๊ณ , ๋ ˆ์ฝ”๋“œ๋Š” ์ด๋Ÿฌํ•œ ๋ถˆ๋ณ€์„ฑ์˜ ๊ฐœ๋…์„ ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต๋˜๋Š” ๊ฐœ๋…์ด๋‹ค.

public record Person {
    public string Name { get; init; }
    public string Age { get; init; }
}

class Program {
    static void Main(string[] args) {
        Person person = new Person {
            Name = "John",
            Age = "30"
        };

        Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
    }
}

์ด๋ ‡๊ฒŒ person์— John, 30์ด๋ผ๋Š” ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด, ์ด ๊ฐ’์€ ๋ถˆ๋ณ€์ด ๋œ๋‹ค.

person.Name="Happy"๋ผ๊ณ  ๊ฐ’์„ ๋‹ค์‹œ ์„ค์ •ํ•ด์ฃผ๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.

๋งŒ์•ฝ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด with๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Person newPerson = person with { Name = "Happy" };

with๋Š” person์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๋ณต์‚ฌํ•œ ๋‹ค์Œ, Name์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’๋งŒ Happy๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

 

๋ ˆ์ฝ”๋“œ์˜ Equals()

์›๋ž˜ Equals() ๋ฉ”์„œ๋“œ๋Š” ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ฆ‰, ๊ฐ’์ด ๊ฐ™์•„๋„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฉด False๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ ˆ์ฝ”๋“œ๋Š” ์ž๋™์œผ๋กœ Equals() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์ฐธ์กฐ ๋น„๊ต๊ฐ€ ์•„๋‹Œ ๊ฐ’ ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.

namespace RecordComp
{
    class CTransaction
    {
        public string From { get; init; }
        public string To { get; init; }
        public int Amount { get; init; }

        public override string ToString()
        {
            return $"{From,-10} -> {To,-10} : ${Amount}";
        }
    }

    record RTransaction
    {
        public string From { get; init; }
        public string To { get; init; }
        public int Amount { get; init; }

        public override string ToString()
        {
            return $"{From,-10} -> {To,-10} : ${Amount}";
        }
    }

    class MainApp
    {
        static void Main(string[] args )
        {
            CTransaction c1 = new CTransaction { From = "Alice", To = "Bob", Amount = 100 };
            CTransaction c2 = new CTransaction { From = "Alice", To = "Bob", Amount = 100 };
            Console.WriteLine(c1);
            Console.WriteLine(c2);
            Console.WriteLine(c1.Equals(c2)); // Equals๋Š” ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•˜๋Š”๋ฐ, c1๊ณผ c2๋Š” ์ฐธ์กฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— False๊ฐ€ ๋‚˜์˜ด

            RTransaction r1 = new RTransaction { From = "Alice", To = "Bob", Amount = 100 };
            RTransaction r2 = new RTransaction { From = "Alice", To = "Bob", Amount = 100 };
            Console.WriteLine(r1);
            Console.WriteLine(r2);
            Console.WriteLine(r1.Equals(r2)); // ๋ ˆ์ฝ”๋“œ๋Š” ์ž๋™์œผ๋กœ Equals ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ํ•„๋“œ ๊ฐ’์„ ๋น„๊ตํ•˜๋„๋ก ํ•จ. ์ฆ‰, ์ฐธ์กฐ๊ฐ€ ๋‹ฌ๋ผ๋„ true๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ

            RTransaction r3 = r1 with { Amount = 300 };
            Console.WriteLine(r3);
            Console.WriteLine(r1.Equals(r3)); // ํ•„๋“œ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด false๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋จ
        }
    }
}

์™œ ์ž๋™์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋˜๋Š” ๊ฒƒ์ผ๊นŒ?

๊ทธ ์ด์œ ๋Š” ๋ ˆ์ฝ”๋“œ๋ผ๋ฆฌ ์ฐธ์กฐ ๋น„๊ต๋Š” ํ•ญ์ƒ false์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ ˆ์ฝ”๋“œ๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค. ๋ ˆ์ฝ”๋“œ๋Š” ๊ฐ’(value) ํƒ€์ž…์œผ๋กœ ์ทจ๊ธ‰๋˜๋ฉฐ ๊ฐ’ ๋น„๊ต๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ์ฝ”๋“œ๋ผ๋ฆฌ์˜ ์ฐธ์กฐ ๋น„๊ต๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

728x90

"); wcs_do();