참조 ( Reference Type )
참조 타입의 객체가 지역변수로 생성되면 힙 ( Heap ) 메모리에 원본 데이터가 올라간다.
그 객체를 가리키는 변수는 그 주소값을 스택 ( Stack ) 메모리에 저장한다.
메모리 저장 위치 설명
class Player
{
public string Name;
}
Player plr = new Player();
plr : 스택 ( Stack ) 에 위치 ( 4 byte 또는 8 byte 주소값 )
new Player() : 힙 ( Heap ) 에 실제 원본 데이터를 할당한다. 인스턴스를 생성한다 ( 실제 데이터 공간 )
변수 plr 는 힙의 메모리 주소를 가리키는 역할을 한다.
class Monster
{
public string Name;
public int Level;
}
void Example()
{
int a = 10; // 값 형식 (int)
int[] numbers = new int[3]; // 참조 형식 (배열)
Monster m1 = new Monster(); // 참조 형식 (클래스)
}
1. int a = 10;
- int 는 값 형식이라서, 변수 a 와 값 10 이 스택 ( Stack ) 에 저장
- 함수 호출이 끝나면 스택 ( Stack ) 에서 자동으로 사라진다.
2. int[] numbers = new int[3];
- 배열은 참조 형식, numbers 라는 참조 ( 주소값 ) 자체는 스택에 저장
- 실제 데이터 [ 0 , 0 , 0 ] 배열은 힙 ( Heap ) 에 저장된다.
3. Monster m1 = new Monster();
- Monster 는 클래스 ( 참조 형식 )
- m1 은 스택에 저장된 참조 ( 주소 ) 이다.
- new Monster () 로 생성된 객체 ( Name , Level 필드 ) 는 힙에 저장
대표적인 참조 타입
C# 에서 기본적인 참조 타입에는 다음과 같은 것들이 있다.
- 클래스 ( Class , 사용자 정의 클래스 )
- Object Type
- 배열 ( Array )
- 델리게이트 ( Delegate )
- 인터페이스 ( Interface )
- String
값 ( Value ) vs 참조 ( Reference )
1. 값 형식 ( Value Type ) : 변수에 실제 데이터 값이 들어간다
- 예시 : int , float , struct 등등
- 복사해서 전덜하면 원본과 사본이 서로 독립적
2. 참조 형식 ( Reference Type ) : 변수에 데이터의 주소 ( 위치 ) 가 들어간다.
- 예시 : class , object , string , array , List<T> 등등
- 복사해서 전달하면 같은 데이터를 가르킨다.
- 한쪽을 수정하면 다른 쪽도 변한다.
정리
참조 타입 변수는 실제 데이터를 가지지 않고, 데이터가 있는 위치 ( 주소 ) 를 참조
참고 자료
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/reference-types