
이 포스팅은 제가 직접 공부하고 제 방식대로 내용을 정리한 글입니다.
Q1. 다음 struct 코드와 class 코드의 결과를 예측해보고, 이유를 생각해봅시다.
public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
public class Program
{
public static void Main()
{
Point point1 = new Point(10, 20);
Point point2 = point1;
point2.X = 30;
Console.WriteLine("Point 1 X: " + point1.X);
Console.WriteLine("Point 2 X: " + point2.X);
}
}
public class Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
public class Program
{
public static void Main()
{
Point point1 = new Point(10, 20);
Point point2 = point1;
point2.X = 30;
Console.WriteLine("Point 1 X: " + point1.X);
Console.WriteLine("Point 2 X: " + point2.X);
}
}
A1. struct의 경우 10, 30. class의 경우 30, 30이 출력됩니다. 이유는 struct는 값 형식이며 class는 참조 형식이기 때문입니다.
point2 = point1;에서 struct는 값 만을 받게된 것이며, class는 point1의 주소값을 받았기에 point2는 point1을 가리키게 됩니다.
그 결과 클래스에서 x의 값을 변경 시 point1의 값이 변경됩니다.
Q1. 참조 형식과 값 형식에 대해 설명해주세요.
A1.
값 형식의 경우 Stack에 값을 저장합니다.하지만 참조 형식의 경우 Stack에 값에 대한 주소값을 저장하며 Heap에 값을 저장합니다.
Q2. 메모리에서 스택과 힙의 차이점에 대해 설명해주세요.
A2.
Stack은 정적인 데이터를 저장하며 작은 크기의 변수나 지역 변수 등의 데이터를 저장합니다. 또한 메모리의 크기가 컴파일 시 결정이 되며, 해당 변수를 실행한 함수가 끝나는 순간 메모리가 해제 됩니다.Heap은 동적인 데이터를 저장하며 큰 크기의 유동적인 변수의 데이터를 저장합니다. 또한 동적이 데이터이기에 런타임에 메모리의 크기가 결정되며, 메모리의 크기는 유동적입니다. 또한 메모리 해제의 경우는 GC(가비지 컬렉터)에 의해 해제됩니다.
Q3. 1번과 2번 질문의 답안을 기반으로 struct와 class의 차이점에 대해 설명해주세요.
A3.
struct는Value-Type으로 값을 Stack에 저장합니다.
class는Reference-Type으로 값을 Heap에 저장하며 해당 값의 저장 위치를 Stack에 저장합니다.Q4. 얕은 복사와 깊은 복사의 차이점은 무엇인가요?
A4. 위에서 풀었던 struct와 class의 출력 결과 차이 문제와 같습니다.
깊은 복사(Deep Copy)란 struct와 같은 Value-Type과 같이 값 전체를 복사하는 경우를 의미합니다.
얕은 복사(Shallow Copy)란 class와 같은 Reference-Type과 같이 참조를 복사하는 경우를 의미합니다.
Q5. 박싱과 언박싱이 일어나는 과정을 메모리 관점에서 설명해주세요.
A5. 박싱은 값 형식을 참조 형식으로 변환하여 힙에 할당하는 작업이며, 언박싱은 참조 형식을 값 형식으로 변환하여 스택에 할당하는 작업입니다.