
1. 다음 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);
}
}
첫 번째 코드: struct 사용
결과 예측:
Point 1 X: 10
Point 2 X: 30
이유:
struct는 값 타입(value type)입니다. 따라서 point2가 point1을 복사할 때, point1의 값이 point2에 복사됩니다. 이후 point2의 X 값을 변경해도 point1의 X 값에는 영향을 미치지 않습니다. 즉, 두 변수는 서로 독립적인 값을 가집니다.
두 번째 코드: class 사용
결과 예측:
Point 1 X: 30
Point 2 X: 30
이유:
class는 참조 타입(reference type)입니다. 따라서 point2가 point1을 참조할 때, point1과 point2는 동일한 객체를 참조합니다. 즉, point2의 X 값을 변경하면 point1의 X 값도 함께 변경됩니다. 두 변수는 동일한 객체를 가리키고 있기 때문입니다.
요약:
struct: 값 타입이기 때문에 변수 간 독립적인 복사가 이루어집니다.
class: 참조 타입이기 때문에 변수 간 객체의 참조가 공유됩니다.
이로 인해 첫 번째 코드에서는 point1.X가 변경되지 않고, 두 번째 코드에서는 point1.X가 point2.X와 동일하게 변경됩니다.
1. 참조 형식과 값 형식에 대해 설명해주세요.
답변:
값 형식은 직접 값을 저장하며 변수에 할당하거나 메서드에 전달할 때 실제 데이터가 복사됩니다. 예로는 int, float, struct 등이 있습니다. 이들은 주로 스택 메모리에 저장됩니다. 반면 참조 형식은 데이터의 메모리 위치를 참조합니다. 변수에 할당하거나 메서드에 전달할 때 주소가 복사됩니다. 예로는 class, string, array 등이 있으며, 주로 힙 메모리에 저장됩니다.
2. 메모리에서 스택과 힙의 차이점에 대해 설명해주세요.
답변:
스택은 선형적인 메모리 영역으로 함수 호출 시 생성되는 지역 변수와 매개변수가 할당됩니다. 할당과 해제가 빠르고 메모리 관리가 자동으로 이루어지지만 크기가 작습니다. 힙은 동적 메모리 할당을 위해 사용되며 객체나 배열 같은 참조 형식의 데이터가 할당됩니다. 할당과 해제는 상대적으로 느리며 가비지 컬렉션에 의해 관리되고 크기가 큽니다.
3. 1번과 2번 질문의 답안을 기반으로 struct와 class의 차이점에 대해 설명해주세요.
답변:
struct는 값 형식으로 스택에 할당됩니다. 값의 복사가 이루어져 독립적인 복사본을 가지며 가비지 컬렉션의 영향을 받지 않습니다. 반면 class는 참조 형식으로 힙에 할당됩니다. 참조의 복사가 이루어져 동일한 객체를 참조하며 가비지 컬렉션의 영향을 받습니다. struct는 일반적으로 크기가 작고 간단한 데이터 구조에, class는 복잡하고 큰 데이터 구조에 적합합니다.
4. 얕은 복사와 깊은 복사의 차이점은 무엇인가요?
답변:
얕은 복사는 객체의 모든 필드 값을 복사하지만 참조 객체는 복사하지 않아서 원본과 복사본이 동일한 참조 객체를 공유합니다. 깊은 복사는 객체의 모든 필드 값을 복사하고 참조 객체도 재귀적으로 복사하여 원본과 복사본이 독립적입니다. 얕은 복사는 변경 사항이 다른 객체에 영향을 미치지만 깊은 복사는 영향을 미치지 않습니다.
5. 박싱과 언박싱이 일어나는 과정을 메모리 관점에서 설명해주세요.
답변:
박싱은 값 형식을 참조 형식으로 변환하는 과정으로, 값 형식의 데이터를 힙에 할당하고 그 참조를 생성합니다. 예를 들어, int 값을 object 타입으로 변환할 때 발생합니다. 언박싱은 참조 형식을 값 형식으로 변환하는 과정으로, 힙에 저장된 데이터를 꺼내어 스택에 있는 값 형식 변수에 저장합니다. 예를 들어, object 타입의 데이터를 int 타입으로 변환할 때 발생합니다.