참조 형식과 값 형식
형식 | 값 형식 | 참조 형식 |
데이터 저장 방법 | 변수가 값을 담는다 | 변수가 값 대신 값이 있는 곳의 위치(주소)를 담는다 |
데이터 저장 위치 | 데이터를 스택에 할당 | 데이터를 힙에 할당 ( 힙 메모리의 주소를 스택에 저장) |
초기화 방법 | 0으로 초기화 | Null로 초기화 |
메모리에서 힙과 스택의 차이점
스택
- 정적으로 메모리에 할당
- 스택은 FILO 구조이다. 변수가 소멸할 때 먼저 들어온 데이터가 마지막에 소멸된다.
힙
- 동적으로 메모리에 할당
- 프로그래머가 원하는 시점에 동적으로 메모리를 할당
- Garbage Collector가 변수를 소멸시킨다
Struct 와 Class의 차이점
구조체
- 값 형식
- 스택에 할당, 복사될 때 값이 복사.
- 상속 X
- 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합
클래스
- 참조 형식
- 힙에 할당, 참조로 전달 -> 동적 할당!!!
- 단일 상속 & 다중 상속 가능.
- 클래스는 더 복잡한 객체를 표현하고 다양한 기능을 제공하기 위해 사용.
얕은 복사와 깊은 복사의 차이점
얕은 복사
- 데이터의 참조를 복사하는 것
깊은 복사
- 데이터의 값 전체를 복사하는 것
- 새로운 객체를 생성 & 내부 값을 복사하여 넘겨주는 것
더보기
배열 arr1이 있다
배열 arr1과 같은 arr2 배열을 만들고 싶을 때
arr1 = arr2와 같이 사용하면
arr2의 값을 수정할 때 arr1의 값도 함께 수정된다.
이는 얕은 복사를 했기 때문이다
박싱과 언박싱이 일어나는 과정을 메모리 관점에서 설명
박싱
- 값 형식의 데이터를 참조 형식으로 변환하는 것
언박싱
- 참조 형식의 데이터를 값형식으로 변환하는 것
예시
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);
}
}
위의 Point 구조체를 아래와 같이 Class로 바꾸면 어떻게 될까?
public class Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point를 클래스로 변경하면 point1과 point2는 동일한 메모리 위치를 가리키는 참조를 가지게 된다.
또한 point1, point2의 데이터가 힙에 저장된다
'Study > 개념 정리' 카테고리의 다른 글
[Study] GC (0) | 2024.07.08 |
---|---|
[Study] 상속과 인터페이스 (0) | 2024.07.05 |
[Study] 콜백, delegate, event (0) | 2024.07.03 |
[Study] 객체지향 프로그래밍 (0) | 2024.07.02 |
[Study] 객체와 한정자 (0) | 2024.07.01 |