Deff_Dev
[C#] 스택 메모리, 힙 메모리 본문
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로 변환할 때 언박싱이 발생
- 박싱은 값 타입을 참조 타입으로 변환하는 과정을 말하고, 값 타입의 데이터를 힙 메모리에 할당하고, 그 데이터에 대한 참조를 가리키는 참조 형식으로 변환된다.
- 언박싱은 참조 타입을 값 타입으로 변환하는 과정을 말하고, 참조 타입의 데이터에서 값을 추출하여 값 타입의 변수에 할당한다.
'면접 질문 정리 > 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 |