본문 바로가기

Unity/Unity 스파르타

리스트, 구조체 - '깊은복사' '얕은 복사'에 대한 고찰

728x90

순서

1. 구조체에 대한 고찰

2. 구조체 객체를 저장하기위한 동적 리스트를 생성했을때 

 

1. 구조체에 대한 고찰

  • *값 형식
  • *구조체는 값에 의한 복사를 수행하며, 변수에 할당된 구조체의 복사본을 수정해도 원래의 구조체에는 영향을 주지 않습니다. 따라서 구조체의 멤버 변수를 수정하려면 해당 구조체를 새로 생성하여 수정된 값을 할당해야 합니다
  • 메모리 할당
    • 구조체는 값 형식이므로 스택(Stack)에 직접 메모리를 할당합니다.  메모리 할당과 해제가 빠르며 데이터의 크기가 작을 때 유리합니다. 그래서 데이터의 읽기와 쓰기가 빠르다는 장점이 있습니다.
int a = 10;
int b = a;

*값 형식은 변수 간에 값이 복사되는데, 변수의 동작 방식을 설명하는 개념입니다.

값 형식의 변수는 해당 변수에 저장된 값이 다른 변수로 할당될 때, 그 값 자체가 복사되어 전달됩니다

b에 a를 할당하게 되면 a에 10이라는 값이 복사되어 b에 전달됩니다.  그래서 a의 값을 변경 하더라도 b의 값은 변하지 않습니다.

 

2. 구조체 객체를 저장하기위한 동적 리스트를 생성했을때  일어나는 일.

Item 이라는 구조체를 저장하는 리스트를 만들고, 새로운 Item을 만들어 리스트에 추가합니다.

List<Item> itemLists = new List<Item>();

 Item newItem1 = new Item("cup", 1500);
 itemLists.Add(newItem1);

만약 Item이 구조체가 아니라 클래스였다면 리스트의 추가된 객체는 참조 형식으로 같은 인스턴스를 참조하게 됩니다.

그리서 newItem1의 인스턴스 값을 바꾸게 되면 원래 리스트에도 영향을 주지만,

구조체의 경우 리스트에 추가하는 순간 값이 복사되어 newItem1의 인스턴스 값을 바꾸더라도 리스트에 영향을 주지 않습니다.

만약 구조체를 저장하는 리스트를 만들었다면 특정 구조체의 값을 바꾸기 위해서는 새로운 구조체를 만든 후 리스트에 덮어 씌워줘야 합니다.

 

 

 

 

728x90