본문 바로가기
cs/운영체제

값 형식 / 참조 형식 이란 ?

by 1chanhue1 2024. 8. 27.

값 형식과 참조 형식 

 

값 형식(Value Types) : 변수가 을 담는 데이터 형식, 스택 메모리 영역에 저장된다. 스택은 빠른 메모리 영역으로, 값 형식의 데이터는 메모리에 연속적으로 저장되어 빠른 접근이 가능하다. 

종류: C#과 같은 언어에서 기본 데이터 타입(int, double, float, char 등), 구조체(struct), 열거형(enum) 등이 값 형식이다.

메모리 관리: 값 형식은 스택에 저장되므로 스코프가 종료될 때 자동으로 메모리가 해제된다.

복사 시 동작: 값 형식을 다른 변수에 할당하면 원본 데이터의 값이 복사된다. 즉, 두 변수는 독립적인 메모리 공간을 차지하게 되며, 하나의 변수를 수정해도 다른 변수에 영향을 주지 않는다.

int a = 5;
int b = a; // b는 a의 값을 복사합니다. a와 b는 각각 독립적인 메모리 공간을 가집니다.
b = 10;    // b의 값을 변경해도 a의 값은 변하지 않습니다.

 

참조 형식(Reference Types) :  변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식, 힙 메모리 영역에 저장된다. 힙은 더 큰 메모리 영역이며, 동적 메모리 할당이 가능하다. 하지만 스택보다 접근 속도가 느릴 수 있다.

종류: 클래스(class), 배열(array), 문자열(string), 델리게이트(delegate), 인터페이스(interface) 등이 참조 형식이다.

메모리 관리:  참조 형식은 가비지 컬렉터(Garbage Collector)에 의해 관리되며, 더 이상 참조되지 않을 때 메모리가 해제된다.

복사 시 동작: 참조 형식을 다른 변수에 할당하면 원본 데이터의 메모리 주소가 복사된다. 따라서 두 변수는 같은 메모리 주소를 참조하며, 하나의 변수를 수정하면 다른 변수도 영향을 받는다.

class MyClass
{
    public int Number;
}

MyClass obj1 = new MyClass();
obj1.Number = 5;

MyClass obj2 = obj1; // obj2는 obj1이 참조하는 동일한 메모리 위치를 참조합니다.
obj2.Number = 10;    // obj2의 Number를 변경하면 obj1의 Number도 변경됩니다.