C# 스택 메모리, 힙 메모리

삐얅·2024년 7월 10일
0

C#

목록 보기
8/9

1. 개요

내배캠에서 제시한 문제를 풀던 와중 깊은 복사, 얕은 복사의 차이점을 찾던 도중 해당 부분에 대한 이해를 스택 메모리와 힙 메모리에 대한 정리가 필요해보여서 해당 내용을 정리하려 한다.

2. 스택(stack) 메모리

스택 메모리는 함수 호출과 관련된 데이터를 저장하는데 사용되는메모리 영역이다. 후입선출 구조로 관리된다.

특징

  • 속도 : 할당과 해제가 빠르다. 함수가 호출될 때 할당되고, 함수가 종료될 때 자동으로 해제된다.
  • 크기 : 한정된 크기를 가지고 있어 스택 오버플로우가 발생할 수 있다.
  • 관리 방식 : 컴파일러에 의해 자동으로 관리된다.
  • 변수 수명 : 스택에 저장된 변수는 해당 함수의 실행이 종료되면서 사라진다.

3. 힙 메모리

힙 메모리는 동적으로 할당된 메모리를 저장하는데 사용된다. 다양한 크기의 데이터를 저장할 수 있고 동적으로 메모리를 할당하고 해제하는데 사용된다.

특징

  • 속도 : 스택에 비해 상대적으로 느리다. 동작 메모리 할당을 위해 복잡한 관리가 필요하다.
  • 크기 : 스택보다 큰 크기를 가지고 있으며, 프로그램의 가용 메모리 양에 따라 달라진다.
  • 관리 방식 : 명시적으로 관리해야한다. C#에서는 가비지 컬렉션이 자동으로 관리해준다.
  • 변수 수명 : 명시적으로 해제하거나 가비지 컬렉션에 의해 해제될 때까지 유지된다.

4. 스택과 힙 메모리의 차이점

  1. 할당 및 해제 속도
    • 스택 : 빠른 할당, 해제(컴파일러가 자동 관리)
    • 힙 : 느린 할당, 해제(명시적으로 관리 또는 가비지 컬렉션으로 자동 관리)
  2. 크기
    • 스택 : 제한된 크기
    • 힙 : 스택보다 상대적으로 큼
  3. 수명
    • 스택 : 함수 호출 동안 유지
    • 힙 : 명시적 해제 또는 가비지 컬렉션까지 유지
  4. 용도
    • 스택 : 함수 호출, 지역 변수 저장
    • 힙 : 동적 메모리 할당, 객체 저장

깊은복사, 얕은 복사

깊은 복사

깊은 복사는 값 타입을 복사하는 것으로 주로 스택 메모리에 저장되며, 복사하면 실제 값이 복사되며, 독립적이다.

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);
    }
}

위 코드를 실행하면 각각 10, 30이라는 출력 값이 나온다.

얕은 복사

얕은 복사는 참조 타입 복사로 힙 메모리에 저장된다. 참조 타입은 실제 데이터가 저장된 위치(메모리 주소)를 저장하며 이를 복사하면 실제 데이터가 저장된 위치(메모리 주소)를 복사하기 때문에 동일한 객체를 가리키게 된다.

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 p1 = new Point(10, 20);
        Point p2 = p1; // 얕은 복사
        p2.X = 30;

        Console.WriteLine(p1.X); // 출력: 30
        Console.WriteLine(p2.X); // 출력: 30
    }
}

위 코드를 실행하면 각각 30, 30의 출력이 나온다

0개의 댓글

관련 채용 정보