Deff_Dev

[C#] 스택 메모리, 힙 메모리 본문

면접 질문 정리/C#

[C#] 스택 메모리, 힙 메모리

Deff_a 2024. 7. 4. 10:13

1. 참조 형식과 값 형식에 대해 설명해주세요. 

public class MyClass
{
    public int Value;
}

// 참조 형식 변수 생성 및 초기화
MyClass obj1 = new MyClass();
obj1.Value = 10;

// 참조 형식 변수를 다른 변수에 할당하면 같은 객체를 가리키는 참조가 복사
MyClass obj2 = obj1;
obj1.Value = 20; // obj1이 가리키는 객체의 속성 변경

Debug.Log(obj1.Value); // 출력: 20 (객체를 공유하므로 obj1과 obj2는 같은 객체를 참조)
Debug.Log(obj2.Value); // 출력: 20
  • 참조 형식
    • 데이터를 힙 메모리에 저장하고 스택에는 데이터에 대한 참조(주소)를 저장한다.
    • class, interface, delegate, object, string 등이 있다.
    • 각 변수는 데이터를 가리키는 참조(주소)를 보유하고 있다.
	// 값 형식 변수 선언
	int x = 10;
	float y = 3.14f;

	// 값 형식 변수를 다른 변수에 할당하면 값이 복사
	int z = x;
	x = 20; // x의 값 변경

	Debug.Log(x); // 출력: 20
	Debug.Log(z); // 출력: 10 (z에는 이전에 복사된 값이 유지)
  • 값 형식
    • 데이터를 스택 메모리에 저장한다.
    • int, float, double, char 등이 있다.
    • 각 변수들은 데이터 값을 직접 보유하고 있다.

2. 메모리에서 스택과 힙의 차이점에 대해 설명해주세요.

  • 스택 메모리는 값 형식의 데이터들이 저장되고 코드 블럭에서 선언된 변수들이 스택에 저장되며 가장 최근에 저장된 데이터부터 차례대로 삭제된다. ( LIFO,)
    • 컴파일 시 메모리 크기가 결정되고 빠르게 할당 및 해제된다
  • 힙 메모리는 참조 형식의 객체들이 저장되고 코드 블력이 끝나는 시점과 상관없이 데이터를 유지시킬 수 있고 참조가 존재하지 않을 시, GC가 해당 데이터의 메모리를 해제한다.
    • 런타임 시 메모리가 동적으로 할당되고 상대적으로 느리다.

 

3. 1번과 2번 질문의 답안을 기반으로 struct와 class의 차이점에 대해 설명해주세요.

  • 구조체는 스택 메모리를 사용하는 값 형식이므로, 해당 코드 블럭에 선언된 구조체는 자동적으로 삭제된다.
  • 클래스는 힙 메모리를 사용하는 참조 형식이므로, 참조가 존재하는 한 코드 블럭이 끝나더라도 힙 메모리에 저장되어 지속적으로 사용가능하다.

 

4. 얕은 복사와 깊은 복사의 차이점은 무엇인가요?

 

얕은 복사는 객체가 저장된 힙 메모리의 주솟값을 복사하는 것으로, 복사된 객체와 원본 객체는 서로 같은 객체를 가르킨다.

 

깊은 복사는 새로운 힙 메모리 영역을 만들어 해당 객체의 필드 값을 복사하는 것으로, 복사된 객체와 원본 객체는 서로 독립된 다른 객체를 가르킨다.

 

5. 박싱과 언박싱이 일어나는 과정을 메모리 관점에서 설명해주세요.

int value = 42; // 값 형식 변수
object obj = value; // int를 object로 변환할 때 박싱이 발생

int newValue = (int)obj; // object를 int로 변환할 때 언박싱이 발생
  • 박싱은 값 타입을 참조 타입으로 변환하는 과정을 말하고, 값 타입의 데이터를 힙 메모리에 할당하고, 그 데이터에 대한 참조를 가리키는 참조 형식으로 변환된다.
  • 언박싱은 참조 타입을 값 타입으로 변환하는 과정을 말하고, 참조 타입의 데이터에서 값을 추출하여 값 타입의 변수에 할당한다.

 

 

 

[Unity/C#] 클래스

해당 포스팅은 고박사님의 유니티 C# 강의를 보고 공부한 내용과 추가적으로 공부한 내용을 정리한 포스팅입니다. 클래스 객체를 표현하는 속성(변수)과 기능(메소드)을 하나의 집합으로 묶는

deff-dev.tistory.com

 

[Unity/C#] 박싱, 언박싱

박싱과 언박싱에 대해 이해할려면 먼저 값 타입과 참조 타입에 대해 알고 있어야한다. 값 타입 값 타입은 데이터를 스택(Stack)에 저장한다. 값 타입에는 int, float, double, char등이 있다. 각 변수들은

deff-dev.tistory.com

'면접 질문 정리 > C#' 카테고리의 다른 글

[C#] 가비지 컬렉터 (Garbage Collectior)  (0) 2024.07.08
[C#] 상속과 인터페이스  (0) 2024.07.05
[C#] 콜백, delegate, event  (0) 2024.07.03
[C#] 객체 지향 프로그래밍  (0) 2024.07.02
[C#] 객체와 한정자  (0) 2024.07.01