• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • C# 프로그래밍의 기초 : 스택과 힙
    2024년 03월 01일
    • 유니얼
    • 작성자
    • 2024.03.01.:55
    728x90

    메모리 관리는 프로그래밍에서 성능 최적화와 직결된 중요한 요소입니다. C#을 포함한 대부분의 프로그래밍 언어에서는 스택과 힙이라는 두 가지 주요 메모리 영역을 통해 데이터를 저장하고 관리합니다. 이 섹션에서는 스택과 힙의 차이점을 예시 코드와 참고용 도표를 통해 상세히 설명하고자 합니다.

    스택 메모리 영역

    스택은 컴파일 시간에 크기가 결정되는 값 타입 데이터를 저장합니다. 메서드 호출 시 해당 메서드의 지역 변수와 매개변수가 스택에 저장됩니다.

    예시 코드: 스택 사용

    void StackExample()
    {
        int value1 = 10; // 스택에 저장
        int value2 = value1; // 스택에 복사본 생성
        value2 = 20; // value2의 값 변경
        Console.WriteLine(value1); // 출력: 10
    }

    스택의 특징

    • 속도: 스택은 메모리에서 빠른 데이터 액세스를 제공합니다.
    • 자동 메모리 관리: 함수 호출이 끝나면 스택에 저장된 지역 변수는 자동으로 해제됩니다.
    • 크기 제한: 스택의 크기는 제한적이며, 초과 시 스택 오버플로우가 발생할 수 있습니다.

    힙 메모리 영역

    힙은 런타임에 동적으로 할당되는 메모리 영역으로, 참조 타입 데이터가 저장됩니다.

    예시 코드: 힙 사용

    void HeapExample()
    {
        var object1 = new Car { Model = "Honda" }; // 힙에 저장
        var object2 = object1; // object1의 참조를 object2에 할당
        object2.Model = "Ford"; // object2를 통해 객체 수정
        Console.WriteLine(object1.Model); // 출력: Ford
    }
    
    class Car
    {
        public string Model { get; set; }
    }

    힙의 특징

    • 동적 메모리 할당: 필요에 따라 메모리 할당 및 해제가 가능합니다.
    • 메모리 관리 필요: 가비지 컬렉터가 더 이상 사용되지 않는 객체를 정리하지만, 메모리 관리에 주의가 필요합니다.
    • 액세스 속도: 스택에 비해 상대적으로 액세스 속도가 느립니다.

    스택 vs 힙

    기준 스택(Stack) 힙(Heap)
    메모리 할당 컴파일 시간에 결정 런타임에 동적으로 할당
    관리 자동으로 할당 및 해제 수동 관리(가비지 컬렉터 도움 받음)
    액세스 속도 빠름 상대적으로 느림
    데이터 타입 값 타입(int, double, struct) 참조 타입(class, array)
    메모리 구조 LIFO(Last In, First Out) 동적, 비연속적
    용도 지역 변수, 매개변수 대규모 데이터, 동적 할당 객체

    예제 코드

    using System;
    
    class Program
    {
        public class MemoryManagementExample
        {
            class Car
            {
                public string Model { get; set; }
            }
    
            private void StackExample()
            {
                int value1 = 10; // 스택에 저장된 지역 변수
                int value2 = value1; // 스택에 복사본이 생성됨
                value2 = 20; // value2의 값을 변경해도 value1에 영향을 미치지 않음
                Console.WriteLine($"StackExample: value1 = {value1}"); // 출력: 10
            }
    
            private void HeapExample()
            {
                var car1 = new Car { Model = "Honda" }; // 힙에 저장된 객체
                var car2 = car1; // car1의 참조(주소)를 car2에 복사
                car2.Model = "Ford"; // car2를 통해 객체의 Model을 변경하면 car1을 통해서도 변경된 상태를 볼 수 있음
                Console.WriteLine($"HeapExample: car1.Model = {car1.Model}"); // 출력: Ford
            }
    
            public void Run()
            {
                // 스택 사용 예제
                StackExample();
    
                // 힙 사용 예제
                HeapExample();
            }
    
        }
    
        static void Main(string[] args)
        {
            var example = new MemoryManagementExample();
            example.Run();
        }
    }

    결론

    스택과 힙의 올바른 이해는 효율적인 메모리 사용 전략을 수립하는 데 필수적입니다. 적절한 메모리 영역을 선택하여 사용함으로써, 프로그램의 성능을 최적화하고 메모리 사용을 효율적으로 관리할 수 있습니다. 또한, 스택 오버플로우나 메모리 누수와 같은 문제를 방지할 수 있습니다. 프로그래머로서 메모리 관리 원칙을 숙지하고, 각 상황에 맞는 최적의 메모리 사용 전략을 선택하는 것이 중요합니다.

     

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바