I'm FanJae.
[20260427] C# 값 형식(Value Type)과 참조 형식(Reference Type) 본문
1. 값 형식(Value Type)과 참조 형식(Reference Type)
※ 핵심적인 차이는 아래와 같다고 생각한다.
변수가 값을 직접 들고 있는가? 아니면 객체를 가리키는 참조를 들고 있는가?
- 변수가 값을 직접 들고 있다면 값 형식(Value Type)이다.
- 변수가 객체를 가리키는 참조를 들고있다면 참조 형식(Reference Type)이다.
1) 값 형식
- 값 형식은 변수 안에 데이터 자체가 들어가는 타입이다.
- 일반적인 정수, 실수, 문자 변수, 구조체, 열거형이 이에 해당한다.
① 값 형식의 특징
int a = 10;
int b = a;
b = 20;
- 값 형식의 변수는 값 자체, 즉 해당 타입의 실제 데이터를 가지고 있다.
- 따라서 값 형식 변수를 다른 변수에 대입하면 원본을 공유하는 것이 아닌 값이 복사된다.
② 메서드(Method) 전달 방식
void ChangeValue(int value)
{
value = 20;
}
Static void main()
{
int num = 10;
ChangeValue(num);
Console.WriteLine(num);
}
- C#에서 메서드 인자는 기본적으로 값으로 전달된다.
- 값 형식을 메서드에 전달하면 해당 값이 복사되어 매개변수로 전달된다.
※ 따라서, 메서드 내부에서 value를 20으로 변경해도 원래 변수인 num에는 영향을 주지 않는다.
③ 저장 공간의 위치 (★)
class Player
{
public int hp;
}
void Func()
{
int localHp = 10; // 일반적으로 Stack에 할당
Player p = new Player(); // 힙에 할당
p.hp = 100; // hp는 Player 객체 안에 있어 이 경우 힙 객체 내부에 있음.
}
- 일반적으로 값 형식 변수의 경우 Stack에 저장된다.
- 단, 값 형식 변수가 클래스의 필드인 경우에는 해당 클래스 객체 내부에 포함된다.
- 따라서, 객체가 힙에 있으면 그 값 형식 필드도 힙 객체 내부에 저장된다.
2) 참조 형식
- 참조 형식은 변수 안에 데이터 자체가 들어가는 것이 아니라, 객체를 가리키는 참조값이 들어간다.클래스, 배열, 문자열, 인터페이스, 델리게이트 등이 이에 해당한다.
① 참조 형식의 특징
class Car
{
public int gas;
}
Car c1 = new Car();
c1.gas = 100;
Car c2 = c1;
c2.gas = 20;
Console.WriteLine(c1.gas); // 20
- 참조 형식 변수는 객체 자체가 아닌, 객체를 가리키는 참조값을 가진다.
- 참조 형식 변수를 다른 변수에 대입하면, 객체가 복사가 되는게 아닌 참조값이 복사된다.
- 위 예제에서 c1과 c2는 같은 객체를 가리키는 것이다.
- 따라서, c2.gas를 변경하면, 같은 객체 내부의 값이 변경되어 c1.gas가 20으로 출력되는 것이다.
② 메서드(Method) 전달 방식
void ChangeGas(Car C)
{
C.gas = 50;
}
static void Main()
{
Car c = new Car();
c.gas = 30;
ChangeGas(c);
Console.WriteLine(c.gas);
}
- C#에서 메서드 인자는 기본적으로 값으로 전달된다.
- 참조 형식을 메서드에 전달하면 객체 자체가 복사되지 않는다.
- 객체를 가리키는 참조 값이 복사가 되어 매개변수로 전달된다.
- 따라서, 메서드 내부의 Car와 외부의 c는 같은 객체를 가리킨다.
※ 즉, 매서드 내부에서 C.gas를 50으로 변경하면 원래 객체의 gas도 변경된다.
③ 저장 공간의 위치 (★)
class Car
{
public int gas;
}
void Func()
{
Car c = new Car();
c.gas = 100;
}
- c는 참조 형식 변수이다.
- c 변수 자체는 지역 변수로, 일반적으로 Stack에 저장된다.
- 하지만, new Car()로 생성된 실제 Car 객체는 힙(Heap)에 저장된다.
- gas는 Car 객체 안에 있는 필드로, 힙 객체 내부에 저장된다.
3. 참고 문서
1) C# 값 형식 - https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/value-types
값 형식 - C# reference
값 형식과 참조 형식, 값 형식의 종류, C#의 기본 제공 값 형식
learn.microsoft.com
2) C# 참조 형식 - https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/reference-types
참조 형식 - C# reference
참조 형식 - C# 참조
learn.microsoft.com
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum) (0) | 2026.04.29 |
|---|---|
| [20260428] 메서드(Method)와 배열(Array) (0) | 2026.04.28 |
| [20260427] C#의 기본적인 내용 정리 (0) | 2026.04.27 |
| [C#] 콘솔 지뢰찾기 만들기 (0) | 2026.04.24 |
| [리마인드] 콘솔 화면 2인용 오목 만들기 (C++) (0) | 2026.04.22 |