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

[C#] ๊นŠ์€๋ณต์‚ฌ ์–•์€๋ณต์‚ฌ, readonly, ๊ตฌ์กฐ์ฒด, ํŠœํ”Œ

by HanaV 2023. 8. 17.
728x90

๊นŠ์€ ๋ณต์‚ฌ/์–•์€ ๋ณต์‚ฌ

์–•์€ ๋ณต์‚ฌ(Shallow Copy): ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ณ ์œ ํ•จ -> ๊ฐ™์ด ๋ณ€ํ•จ

using System;

class Program
{
    static void Main()
    {
        int[] originalArray = { 1, 2, 3 };
        int[] shallowCopyArray = (int[])originalArray.Clone();

        shallowCopyArray[0] = 99;

        Console.WriteLine("Original Array: " + string.Join(", ", originalArray)); // ์ถœ๋ ฅ: Original Array: 1, 2, 3
        Console.WriteLine("Shallow Copy Array: " + string.Join(", ", shallowCopyArray)); // ์ถœ๋ ฅ: Shallow Copy Array: 99, 2, 3
    }
}

๊นŠ์€ ๋ณต์‚ฌ(Deep Copy): ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋ณต์‚ฌ๋˜์–ด์„œ ์›๋ณธ ๊ฐ์ฒด์™€๋Š” ์™„์ „ํžˆ ๋ถ„๋ฆฌ

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] originalArray = { 1, 2, 3 };
        int[] deepCopyArray = originalArray.Select(x => x).ToArray();

        deepCopyArray[0] = 99;

        Console.WriteLine("Original Array: " + string.Join(", ", originalArray)); // ์ถœ๋ ฅ: Original Array: 1, 2, 3
        Console.WriteLine("Deep Copy Array: " + string.Join(", ", deepCopyArray)); // ์ถœ๋ ฅ: Deep Copy Array: 99, 2, 3
    }
}

 

์ฝ๊ธฐ ์ „์šฉ: readonly

์ƒ์„ฑ์ž๋กœ ์ดˆ๊ธฐํ™”๋œ ํ›„์—๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ณ€์ˆ˜์ด๋‹ค. (๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค)

class MyClass
{
    public readonly int MyReadOnlyField;

    public MyClass(int value)
    {
        MyReadOnlyField = value;
    }
}

class Program
{
    static void Main()
    {
        MyClass instance = new MyClass(10);

        Console.WriteLine(instance.MyReadOnlyField); // 10 ์ถœ๋ ฅ

        // ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
        // instance.MyReadOnlyField = 20;
    }
}

readonly์™€ const์˜ ๊ณตํ†ต์ ์€ ๋‘˜ ๋‹ค ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ด๊ณ ,
์ฐจ์ด์ ์€ readonly๋Š” ์ƒ์„ฑ์ž ๋‚ด์—์„œ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๊ตฌ์กฐ์ฒด (struct)

struct:: ๊ฐ’ ํƒ€์ž…(Value Type) => ๊นŠ์€ ๋ณต์‚ฌ
class: ์ฐธ์กฐ ํƒ€์ž…(Reference Type) => ์–•์€ ๋ณต์‚ฌ

using System;

struct MyStruct
{
    public int Value;
}

class MyClass
{
    public int Value;
}

class Program
{
    static void ModifyStruct(MyStruct s)
    {
        s.Value = 100;
    }

    static void ModifyClass(MyClass c)
    {
        c.Value = 100;
    }

    static void Main()
    {
        MyStruct structInstance = new MyStruct();
        structInstance.Value = 10; //10์œผ๋กœ ์„ค์ •ํ•˜๊ณ 
        ModifyStruct(structInstance); //๊นŠ์€๋ณต์‚ฌํ•ด์„œ 100
        Console.WriteLine($"Struct Value: {structInstance.Value}"); // ์ถœ๋ ฅ: 10 (๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ)

        MyClass classInstance = new MyClass();
        classInstance.Value = 10; //10์œผ๋กœ ์„ค์ •ํ•˜๊ณ 
        ModifyClass(classInstance); //์–•์€๋ณต์‚ฌํ•ด์„œ 100
        Console.WriteLine($"Class Value: {classInstance.Value}"); // ์ถœ๋ ฅ: 100 (๊ฐ’์ด ๋ณ€๊ฒฝ๋จ)
    }
}

struct:: readonly ์„ ์–ธํ•ด์„œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ฐ€๋Šฅ (๋‚ด๋ถ€์—๋„ ๋ชจ๋‘ readonly๋กœ ์„ ์–ธํ•ด์ค˜์•ผํ•จ)
class: ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ์„ ์–ธ ์•ˆ๋จ, ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๋‹ค์ค‘ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์Œ

 

ํŠœํ”Œ

C# 7.0๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ, ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌถ์Œ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

using System;

class Program
{
    static (string, int) GetPersonInfo()
    {
        string name = "John";
        int age = 30;
        return (name, age); // ํŠœํ”Œ ๋ฐ˜ํ™˜
    }

    static void Main()
    {
        var person = GetPersonInfo();

        Console.WriteLine($"Name: {person.Item1}, Age: {person.Item2}");
    }
}
728x90

"); wcs_do();