C#에서 변수를 만들 때, 우리는 보통 “변수에 값이 들어간다”고 생각합니다.
그런데 자료형에 따라 변수 안에 들어가는 것이 두 가지로 갈립니다.
이 차이는 단순 개념이 아니라, 실제 코드에서 대입했을 때, 수정했을 때, 함수에 전달했을 때 동작을 완전히 바꿉니다.

값 형식: 대입하면 “내용”이 복사된다
int a = 10;
int b = a; // a의 값(10)이 b로 복사됨
b = 20;
Console.WriteLine(a); // 10
Console.WriteLine(b); // 20
b를 바꿔도 a는 그대로입니다.
왜냐하면 처음 대입할 때부터 서로 다른 값을 가지고 있기 때문입니다.
참조 형식: 대입하면 “주소표(참조)”가 복사된다
int[] arr1 = { 1, 2, 3 };
int[] arr2 = arr1; // arr1이 가리키는 "같은 배열"을 arr2도 가리킴
arr2[0] = 999;
Console.WriteLine(arr1[0]); // 999
Console.WriteLine(arr2[0]); // 999
arr2를 수정했는데 arr1도 바뀐 것처럼 보입니다.
정확히는 arr1과 arr2가 같은 배열(같은 객체)을 공유하고 있기 때문입니다.
그래서 참조 형식은 상자를 복사해도 “쪽지”만 복사되고, 창고(객체)는 그대로 하나라서 함께 영향을 받습니다.
값 형식(Value Type)
참조 형식(Reference Type)
여기서 가장 많이 헷갈리는 게 string입니다.
string은 생김새는 값처럼 보이지만, 분류는 참조 형식입니다.
배열이나 List는 수정이 가능합니다(“mutable”).
하지만 string은 불변(immutable) 입니다.
string s1 = "hi";
string s2 = s1;
s2 = "bye";
이때 s2를 바꾼 게 아니라, s2가 새 문자열을 가리키게 된 것입니다.
그래서 “참조 형식인데도 값 형식처럼” 느껴질 수 있습니다.
핵심만 정리하면:
C#의 기본 전달 방식은 값 전달(call by value) 입니다.
여기서 중요한 포인트는 “값 전달”이 항상 값 형식만 의미하는 게 아니라는 점입니다.
즉, 참조 형식도 기본은 “값 전달”인데, 그 값이 ‘참조’인 것입니다.
void ChangeFirst(int[] a)
{
a[0] = 777; // 배열 내용 수정 (공유된 객체에 반영)
}
int[] x = { 1, 2, 3 };
ChangeFirst(x);
Console.WriteLine(x[0]); // 777
| [C# 이해하기] 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) (0) | 2026.01.03 |
|---|---|
| 컴퓨터 구조 (0) | 2025.12.09 |
| [C언어] 데이터 입력 (0) | 2025.12.09 |
| [C언어] 문자열 (0) | 2025.11.30 |
| [C언어] 정수 자료형과 실수 자료형 (0) | 2025.11.29 |