[C#] 복사(값)와 참조

자몽이·2025년 10월 26일

C# 문법

목록 보기
1/12
post-thumbnail

복사와 참조에 대해 알아보자

값 (value type) 타입

  • 변수에 실제 값이 저장되고, 대입이나 메서드 호출 시 값이 복사 된다.
  • 함수 인자 전달 : 메서드 내부에서 수정하면 원본에 영향이 없다.
  • 대표적인 예시로는 int, float, bool, enum, struct (Vector3, Quaternion).
void ChangeNum(int x)
{
	x = 10;
}

void start()
{
	int a = 1;
    ChangeNum(a);
    Debug.Log(a);
}

이러한 함수가 있다고 가정할 때, a의 값은 변하지 않는다.


✅ 값 타입은 함수가 전달될 때 복사본이 만들어진다.

  1. a변수는 메모리 어딘가에 5라는 값을 저장하고 있다.
    (예: 주소 0x100 -> 값 5)
  2. ChangeNumber(a) 호출 시, a의 값인 5가 복사되어 새 변수 x에 저장된다
    (예: 주소 0x200 -> 값 5)

✅ 함수 안에서 바꾸면 복사본만 바뀌고 원본은 그대로다.

함수 안에서 x = 10; 해도 0x200의 값만 바뀌고 0x100은 그대로이다.
즉 함수 종료시 x는 스택에서 사라지고 a는 영향이 없다.

✅ 값 타입의 원본을 수정하고 싶다면 ref나 out을 사용해야 한다.



참조 타입 (Reference types)

  • 변수에 객체가 위치한 메모리 주소가 저장된다.
  • a = b;를 하게되면 a와 b가 같은 객체를 가리킨다.
  • 함수 인자 전달 : 전달되는 것은 참조의 복사. 함수 내부에서 객체의 멤버를 변경하면 원본에 반영된다.
  • 예시로는 class, List, Dictionary, GameObject, MonoBehaviour 등.

class MyClass { public int value; }

void ChangeValue(MyClass data)
{
	date.value = 10;	
]

void start()
{
	MyClass.a = new MyClass { value = 5 };
    ChangeValue(a);
    Debug.Log(a.value);
    
}

여기서 a는 MyClass의 주소가 저장되어 있다.
함수에 a를 전달하면 그 주소값이 복사되지만, 복사된 주소가 같은 객체를 가리키고 있으므로
함수 안에서 객체의 멤버(value)를 수정하면 원본에도 영향이 간다.


✅참조 타입은 "주소"가 복사되므로, 내부 데이터를 바꾸면 원본도 바뀐다.

profile
개발자가 되는 그 날 까지

0개의 댓글