-
[TIL] 13주차 3일 기술 면접 대비개발일지/스파르타 코딩클럽 부트캠프 2024. 7. 10. 20:35
다음 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); } }
1. 10 30
구조체는 값 형식이므로 point2.x 값을 바꾸어도 값이 바뀌지 않는다.
2. 30 30
클래스는 참조 형식이기 때ㅜㅁㄴ에 point2.x를 참조해서 x값이 모두 30으로 바뀐다.
설명 문제
💡 질문을 직접 설명해보고, 모르는 부분이 있다면 알아보는 시간을 가집시다.
- 참조 형식과 값 형식에 대해 설명해주세요.
- 메모리에서 스택과 힙의 차이점에 대해 설명해주세요.
- 1번과 2번 질문의 답안을 기반으로 struct와 class의 차이점에 대해 설명해주세요.
- 얕은 복사와 깊은 복사의 차이점은 무엇인가요?
- 박싱과 언박싱이 일어나는 과정을 메모리 관점에서 설명해주세요.
1번 답 : 값 형식은 변수가 실제로 데이터를 저장하는 유형이다. 값을 직접 메모리에 저장한다.
스택 메모리에 할당하고, 빠르게 접근이 가능하며 기본 데이터 타입, 구조체가 있다.
참조 형식은 실제 데이터가 저장된 메모리 위치(참조)를 저장하는 데이터 유형이다.
힙 메모리에 할당하고, 더 큰 메모리 공간을 사용하며, 동적 메모리 할당에 적합하다. 실제로
데이터의 참조(메모리 주소)가 복사된다.
2번 답 : 스택은 컴파일 시간에 크기가 결정되는 변수들을 저장하는데 사용되고, 힙은 런타임에 크기가 결정되거나
변경될 수 있는 데이터를 저장하는데 사용된다.
3번 답 :
메모리 할당 struct: 주로 스택에 할당되지만, struct가 클래스의 필드로 사용되면 힙에 할당될 수 있다. 스택에 할당되므로 할당과 해제가 빠르다. class: 항상 힙에 할당된다. 힙에 할당되므로 할당과 해제가 상대적으로 느리다. 가비지 컬렉터에 의해 관리되므로 메모리 해제 시점이 불확실하다. 상속기본 생성자 struct: 기본 생성자가 자동으로 제공된다. 매개변수가 없는 생성자를 정의할 수 없다. 필드를 초기화하지 않아도 된다. class 기본 생성자를 정의할 수 있다. 매개변수가 없는 생성자를 포함하여 여러 생성자를 정의할 수 있다. 필드는 명시적으로 초기화하거나, 생성자에서 초기화해야 한다.
- struct: 상속을 지원하지 않는다. 다른 struct나 class로부터 상속받을 수 없으며, 상속할 수도 없다. 인터페이스는 구현할 수 있다. class: 상속을 지원한다. 다른 클래스에서 상속받을 수 있으며, 상속할 수도 있다. 인터페이스도 구현할 수 있다.
- 값 형식 vs. 참조 형식 struct: 값 형식(Value Type)이다. 스택(Stack)에 할당된다. 변수에 struct를 할당하면 실제 데이터의 복사본이 생성됩니다. 즉, struct를 다른 변수에 할당하거나 함수에 전달할 때 데이터가 복사된다. 구조체의 복사본을 수정해도 원래 구조체에는 영향을 미치지 않는다. class: 참조 형식(Reference Type)이다. 힙(Heap)에 할당된다. 변수에 class 객체를 할당하면 객체의 참조(메모리 주소)가 저장된다. 즉, 객체를 다른 변수에 할당하거나 함수에 전달할 때 데이터의 참조가 전달된다. 객체의 참조를 수정하면 해당 객체의 모든 참조가 영향을 받는다.
4번 답:깊은 복사 (Deep Copy) : 깊은 복사는 객체와 그 객체가 참조하는 모든 하위 객체들을 재귀적으로 복사한다. 이는 원본 객체와 복사본 객체가 서로 독립적인 구조를 가지게 됨을 의미한다.
얕은 복사(Shallow Copy) : 얕은 복사는 객체의 최상위 수준만 복사하며, 객체가 참조하는 하위들(즉, 중첩된 객체들)은 원본 객체와 동일한 참조를 갖게 된다. 이는 객체의 복사본이 원본 객체와 동일한 하위 객체들을 참조하게 됨을 의미된다.
5번 답 : 언박싱(Unboxing) : 언박싱은 참조 형식을 값 형식으로 변환하는 과정이다. 힙에 저장된 객체의 값을 스택에 있는 값 형식 변수로 복사한다.메모리 관리 : 힙에 할당된 객체는 가비지 컬렉터에 의해 관리된다. 따라서 많은 박싱 작업은 가비지 컬렉션 부담을 증가시킬 수 있다.박싱(Boxing) : 박싱은 값 형식을 참조 형식으로 변환하는 과정이다. 값 형식을 객체(Object)로 감싸서 힙(Heap) 메모리에 저장하고, 이 객체의 참조를 반환한다.
'개발일지 > 스파르타 코딩클럽 부트캠프' 카테고리의 다른 글
[TIL] 13주차 4일 기술 면접 대비 (0) 2024.07.15 [TIL] 14주차 1일 DOTween (0) 2024.07.15 [TIL] 13주차 2일 FSM에서 신경써야 할 부분 ( 트러블 슈팅 ) (2) 2024.07.09 [TIL] 13주차 1일 유니티 2D 플레이어 피격 구현 ( OnTriggerEnter2D, Action ) (0) 2024.07.08 [TIL] 12주차 5일 유니티 스킬 장착, 스킬 슬롯 로직 (0) 2024.07.05