[C#] 6-1. 값 타입 vs 참조 타입

치치·2024년 11월 22일
0

C#

목록 보기
9/16
post-thumbnail

📌 값 타입 (Value Type)

  • 매개변수로 들어온 x, y를 서로 바꾸는 함수
static void Swap(int x, int y)
{
    int temporary = y;

    y = x;
    x = temporary;
}
  • 메인함수에서 선언한 x, y
int x = 10;
int y = 20;

Swap(x, y);
Console.WriteLine("x의 값은: " + x);
Console.WriteLine("y의 값은: " + y);
  • 메인함수의 x, y는 값이 복사되어 함수로 들어가게 되고 함수 안에서만 교환이 이루어지고 따로 반환되지 x
  • 값이 복사되었기 때문에 메인함수의 x, y와는 별개

📌 참조 타입 (Reference Type)

  • 메모리 내의 객체나 데이터 구조를 가리키는 주소를 저장

  • 포인터랑 같은 것
  • ✅ 여기서 object는 값 타입, 참조 타입 모두 가능
  • ✅ object여도 참조 타입이 조금 더 큼
  • 크기가 5인 배열을 생성하고 1,2,3,4,5로 초기화
  • 배열의 인덱스에 접근하여 값을 바꾸는 Swap 함수 생성
  • 사진상의 container라는 이름을 가진 배열은 배열이 저장된 주소를 가리킴

  • list라는 이름을 가진 배열이 배열이 저장된 주소를 가리킴

  • 그 주소를 참조하여 값을 변경 할 수 있음

  • 🔒 배열의 이름은 배열의 시작주소

static void Swap(int[] list)
{
    list[0] = 5;
    list[1] = 4;
    list[2] = 3;
    list[3] = 2;
    list[4] = 1;
}
int[] list = new int[5]    
{1,2,3,4,5};

Swap(list);

for(int i = 0; i < list.Length; i++) 
{
    Console.WriteLine(list[i]);
}

즉 위의 코드는 list라는 배열의 이름으로 배열의 시작주소를 가리키고 있고, 이 list로 배열에 접근하여 값을 변경 할 수 있다


✅ 값 타입과 참조 타입을 알았으면 박싱과 언박싱에 대해서도 알 수 있다

📌 박싱이란?

  • 값 형식 데이터를 참조 형식으로 변환하는 과정

  • 값 형식은 Stack에 저장

  • 박싱 할 경우 stack의 값이 복사되어 heap에 저장

int code = 10;

object data = code;

Console.WriteLine("data 변수의 값 : " + data);

결과값: data 변수의 값 : 10


📌 언박싱이란?

  • 참조 형식의 데이터를 값 형식으로 변환하는 과정
  • 힙에 저장되어 있는 참조형식을 강제 형변환 시켜 값 형식으로 변경 후 Stack에 저장
char alphabet = 'A';

object pointer = alphabet;

alphabet = (char)pointer; // 강제 형변환 해주어야 함

Console.WriteLine(pointer);    

결과값 : A



const & 상수참조 타입

ex) const & 로 x 값을 반환한다

const int & X()
{
	return x;    
}
  • const (상수) : 반환하는 x값을 상수타입으로 반환한다 -> 값 변경 불가
  • & (참조) : 반환하는 x값을 값 복사가 아닌, 참조로 반환한다 -> 실제 x의 메모리를 가리키며, 복사비용이 발생하지 않는다

즉, const와 &를 함께 쓰는 이유는,
값 변경을 방지(상수)하면서, 복사비용 없이(참조) 원본을 읽기 위해서다



박싱 예시

int x = 10;

object obj = x;

profile
뉴비 개발자

0개의 댓글