Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

I'm FanJae.

[20260427] C# 값 형식(Value Type)과 참조 형식(Reference Type) 본문

Unity/Unity 초격차캠프

[20260427] C# 값 형식(Value Type)과 참조 형식(Reference Type)

FanJae 2026. 4. 27. 18:15

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

 

 

Comments