(C#)불변성 (Immutable)

장장·2025년 9월 22일

불변성 동영상 강의

불변성 (Immutable)

  • 객체가 생성된 후에는 그 데이터가 변경되지 않는 특징
  • 참조타입: 데이터를 생성할때 힙에 메모리 주소를 생성후 값을넣고,
    객체(스택에 존재)에 그 주소를 알려줌
  • string, delegate, class 모두 참조 타입이다
  • 만약 string을 불변성없게 쓰고싶다면 stringBuilder을 쓴다.

1. string, delegate (불변타입, Immutable)

  • string, delegate 가 포함되며 깊은 복사의 형태
  • string과 delegate는 데이터가 변경될때 변경된 객체가 힙에 재할당해서
    자신 혼자 그 주소를 가리킴
  • string과 delegate는 한쪽의 주소를 참조해고 한쪽을 변경해도 둘다 값이 바뀌지않는다
  • 예) str1에 Shoot라는 새로운 값을 할당하면? 힙에 새로운 데이터공간을 할당하고, 객체가 그 주소를 가리킴
class Program
{
    delegate void MyDelegate();
    static void Main(string[] args)
    {
    	//1. string
		string str1 = "Hello";
		string str2 = str1;
		str1 = "Shoot";
		Console.WriteLine($"str1:{str1} str2:{str2}"); //str1:Shoot str2:Hello 참조타입이지만 값이 변하지않음 
        
        //2. delegate
		MyDelegate myDelegate1 = () => { Console.WriteLine("myDel_First"); };
		MyDelegate myDelegate2 = myDelegate1;
		myDelegate1 = () => { Console.WriteLine("myDel_Edit"); };
		myDelegate1?.Invoke(); //myDel_Edit
		myDelegate2?.Invoke(); //myDel_First
    }
}

값이 변하지 않는 것을 확인 할 수 있다.

2. class, stringBuilder (가변타입,Mutable)

  • class는 한쪽이 참조되는 상황일때 한쪽을 변경하면 둘다 값이 변경된다(얕은복사)
  • 예) animal2의 age에 20을 설정하면? 힙주소공간은 그대로, 안의 값들만 변경
  • animal1과 animal2가 같은곳을 가리키고있으므로 둘다 변경된다
class Animal
{
    int age;
    public void SetAge(int input)
    {
        age = input;
    }
    public void PrintAge()
    {
        Console.WriteLine($"동물나이: {age}");
    }
}
class Program
{
	static void Main(string[] args)
	{
		Animal animal1 = new Animal();
		Animal animal2 = animal1;
		animal1.SetAge(10);
		animal2.SetAge(20);
		animal1.PrintAge(); //동물나이: 20
		animal2.PrintAge(); //동물나이: 20
	}
}

animal1을 변경하면 animal2가 변경되는 것을 확인 가능

0개의 댓글