[C#] 값 형식과 참조 형식의 메모리 저장 방식 차이

2024. 3. 1. 05:00C#

값 형식과 참조 형식은 메모리가 저장되는 방식에서 기본적으로 스택(Stack)과 힙(Heap)의 차이를 나타낸다.

두 형식이 메모리에 어떻게 저장되는지 봅시다.

 

1. 값 형식 (Value Types)

스택 (Stack)

값 형식의 변수는 주로 스택에 저장된다.

스택은 빠르게 데이터를 할당하고 해제할 수 있는 메모리 영역이다.

값 형식의 변수는 변수의 크기에 따라 스택 프레임에 직접 저장된다.

스택에 저장된 값 형식 변수는 해당 변수의 스코프(영역)을 벗어나면 자동으로 제거된다 (스택 메모리의 특성 때문)

 

스택은 함수 호출 시 로컬 변수 및 함수 호출 정보를 저장하는 데 사용되는 메모리 영역이다.

함수의 실행이 끝나면 해당 함수의 스택 프레임이 제거된다. (**)

// < 값 형식의 변수 할당 예시 >

int x = 10;		// x는 스택에 직접 값 10을 저장

 

 

** 추가 설명

여기서 exampleFunction()이 호출되면 'x'라는 값 형식의 변수가 exampleFunction() 의 스택 프레임에 할당된다.

그러나 exampleFunction()이 실행을 완료하면 해당 스택 프레임이 제거된다.

따라서 'x'도 함께 제거되어 메모리에서 사라지게 된다.

 

스택의 특성은 함수 호출의 재귀적 성질과도 관련이 있다.

각 함수 호출은 새로운 스택 프레임을 만들며, 함수가 종료되면 해당 스택 프레임이 제거되어 이전 스택 프레임으로 돌아간다.

따라서 '값 형식 변수가 스코프를 벗어나 자동으로 제거된다'는 것은 해당 변수의 스택 프레임이 소멸되면서 변수도 함께 제거되어 메모리에서 해제됨을 의미한다.

using System;

class Program
{
	static void Main()
    {
    	exampleFunction();
        Console.WriteLine("Main Function Ends.");
    }
    
    static void exampleFunction()
    {
    	int x = 10;		// x는 exampleFunction의 스택 프레임에 저장됨
        Console.WritLine("Inside exampleFunction: " + x);
	}
}

 

 

 

 

2. 참조 형식 (Reference Types)

힙 (Heap)

참조 형식의 객체는 힙에 저장된다.

힙은 더 큰 데이터를 저장할 수 있는, 생명주기가 더 긴 메모리 영역이다.

참조 형식의 변수는 스택에는 해당 객체의 참조(메모리 주소)만 저장하고, 실제 객체는 힙에 생성된다.

힙에 저장된 객체는 명시적으로 제거되지 않는 한 유지된다.

// < 참조 형식의 변수 할당 >

// obj는 스택에 참조(힙의 메모리 주소)를 저장하고, MyClass 객체는 힙에 생성
MyClass obj = new MyClass();

 

 

 

3. 요약

값 형식 : 실제 값을 스택에 저장

참조 형식 : 실제 객체는 힙에 저장되고, 스택에는 참조(메모리 주소)가 저장

 

스택: 빠르게 할당 및 해제되는 작은 메모리 영역

힙: 더 큰 데이터와 긴 생명주기를 가진 메모리 영역

 

이러한 차이로 값 형식은 직접 데이터를 저장하고 빠르게 할당 및 해제할 수 있으며, 참조 형식은 힙에서 객체를 생성하고 참조를 스택에 저장하여 메모리를 효율적으로 활용할 수 있다.

'C#' 카테고리의 다른 글

[C#] 인터페이스  (0) 2024.02.19
[C#] 자료구조의 역사  (0) 2024.02.14