Ssssong += Dev

[C#] 구조체와 클래스의 값 복사 본문

개발/공부

[C#] 구조체와 클래스의 값 복사

ssong_dev 2022. 5. 9. 09:51

헷갈리는 부분 다시 정리...

 

일반적으로

구조체의 복사는 값의 복사이고(깊은 복사)

클래스의 복사는 주소의 복사이다.(얕은 복사)

 

유니티에서 인스펙터 창에 public으로 끌어다 놓은 객체는 클래스의 복사로, 변경 시 원본의 변경이 일어난다.

public Transform tempTransform;
//이후 인스펙터 창에서 tempTransform에 오브젝트 복사해 넣음

Vector3 tempVec = new Vector3(10, 10, 10);

tempTransform.position = tempVec;

이런 식으로 사용했을 때 원본 오브젝트의 포지션이 바뀌게 된다.

 

 

그러나 int num = 10; 이렇게 선언된 변수 num은 int가 구조체이기 때문에

int num = 10;
int input = 0;

num = input;
input = 30;

이런 식으로 변경하면 num은 num = input 때에만 변경되어 0이 나오게 된다.

 

예외의 경우도 있는데, 

string의 경우 class 타입이지만 구조체처럼 값에 의한 복사가 일어난다.

이는 C++와 형식을 맞추기 위함이다.

 

구조체에서 주소에 의한 복사를 실행하기 위해서는 ref, in, out을 사용한다.

 

+ 깊은 복사를 위한 DeepCopy() 메서드를 확장메서드로 추가해서 사용하는 방법도 있다.

public static T DeepCopy<T>(this T value) where T : class, new()
{
    T clone = new T();
    return clone;
}