본문 바로가기

C#/Knowledge

스택 메모리 vs 힙 메모리

1-1. 다음 struct 코드의 결과를 예측해 보세요.

10 30
구조체는 값 형식이므로 point2.x 값을 바꾸어도 값이 바뀌지 않는다.


1-2. 다음 class 코드의 결과를 예측해 보세요.

30 30
클래스는 참조 형식이니까 point2.x 를 참조해서 x 값이 모두 30으로 바뀐다


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

참조 형식: 실제 데이터가 저장된 메모리 위치(참조)를 저장하는 데이터 유형이다. >> 힙 메모리에 할당, 더 큰 메모리 공간을 사용하며 동적 메모리 할당에 적합 , 실제 데이터의 참조(메모리 주소)가 복사된다.

값 형식: 변수가 실제 데이터를 저장하는 데이터 유형이다. 값을 직접 메모리에 저장한다. >> 스택 메모리에 할당 , 빠르게 접근 가능 , 기본 데이터 타입들 , 구조체가 있다.


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

스택은 컴파일 시간에 크기가 결정되는 변수들을 저장하는데 사용되며, 힙은 런타임에 크기가 결정되거나 변경될 수 있는 데이터를 저장하는 데 사용된다.

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

값 형식 vs. 참조 형식

struct는 값 형식으로 스택에 할당된다.
변수에 struct를 할당하면 실제 데이터의 복사본이 생성된다. 즉, struct를 다른 변수에 할당하거나 함수에 전달할 때 데이터가 복사된다. 구조체의 복사본을 수정해도 원래 구조체에는 영향을 미치지 않는다.

class는 참조 형식으로 힙에 할당된다.
변수에 class 객체를 할당하면 객체의 참조(메모리 주소)가 저장된다. 즉, 객체를 다른 변수에 할당하거나 함수에 전달할 때 데이터의 참조가 전달된다. 객체의 참조를 수정하면 해당 객체의 모든 참조가 영향을 받는다.

메모리 할당
struct: 주로 스택에 할당되지만, struct가 클래스의 필드로 사용되면 힙에 할당될 수 있다. 스택에 할당되므로 할당과 해제가 빠르다.
class: 항상 힙에 할당된다. 힙에 할당되므로 할당과 해제가 상대적으로 느리다. 가비지 컬렉터에 의해 관리되므로 메모리 해제 시점이 불확실하다. 상속

struct: 상속을 지원하지 않는다. 다른 struct나 class로부터 상속받을 수 없으며, 상속할 수도 없다. 인터페이스는 구현할 수 있다.
class: 상속을 지원한다. 다른 클래스에서 상속받을 수 있으며, 상속할 수도 있다. 인터페이스도 구현할 수 있다.

기본 생성자
struct: 기본 생성자가 자동으로 제공된다. 매개변수가 없는 생성자를 정의할 수 없다. 필드를 초기화하지 않아도 된다. class: 기본 생성자를 정의할 수 있다. 매개변수가 없는 생성자를 포함하여 여러 생성자를 정의할 수 있다. 필드는 명시적으로 초기화하거나, 생성자에서 초기화해야 한다.


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

얕은 복사(Shallow Copy) : 객체의 최상위 수준만 복사하며, 객체가 참조하는 하위들(즉, 중첩된 객체들)은 원본 객체와 동일한 참조를 갖게 된다. 이는 객체의 복사본이 원본 객체와 동일한 하위 객체들을 참조하게 됨을 의미된다.

깊은 복사 (Deep Copy) : 객체와 그 객체가 참조하는 모든 하위 객체들을 재귀적으로 복사한다. 이는 원본 객체와 복사본 객체가 서로 독립적인 구조를 가지게 됨을 의미한다.


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

박싱(Boxing) : 박싱은 값 형식을 참조 형식으로 변환하는 과정이다. 값 형식을 객체(Object)로 감싸서 힙(Heap) 메모리에 저장하고, 이 객체의 참조를 반환한다.

언박싱(Unboxing) : 언박싱은 참조 형식을 값 형식으로 변환하는 과정이다. 힙에 저장된 객체의 값을 스택에 있는 값 형식 변수로 복사한다.

메모리 관리 : 힙에 할당된 객체는 가비지 컬렉터에 의해 관리된다. 따라서 많은 박싱 작업은 가비지 컬렉션 부담을 증가시킬 수 있다.

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

GC 가비지 컬렉터  (0) 2024.07.11
상속과 인터페이스  (0) 2024.07.09
콜백, delegate, event  (0) 2024.07.04
객체지향 프로그래밍  (0) 2024.07.04
객체와 한정자  (0) 2024.07.01