본문 바로가기
Study/개념 정리

[Study] 스택 메모리 , 힙 메모리

by chobbo 2024. 7. 3.

참조 형식과 값 형식

형식 값 형식 참조 형식
데이터 저장 방법 변수가 값을 담는다 변수가 값 대신 값이 있는 곳의 위치(주소)를 담는다
데이터 저장 위치 데이터를 스택에 할당 데이터를 힙에 할당 ( 힙 메모리의 주소를 스택에 저장)
초기화 방법 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