Dispose & using

이진호·2024년 6월 10일

C#... 그리고 Unity

목록 보기
13/15

C#은 C나 C++과 다르게 가비지컬렉션을 통해 메모리 관리를 직접해준다. 하지만 C#의 성능에 가장 영향을 끼치는 부분이기도 하다.

가비지 컬렉션은 새로운 데이터를 추가하려고 할때 힙메모리에 저장공간이 부족한 경우 루트를 통해 참조하지 않는 데이터를 정리하고 메모리를 압축하는 과정을 진행하는데 가비지컬렉션이 작동할때에는 프로그램의 작동이 잠시 멈춘다. 그래서 다른 언어와 같이 용량이 큰 데이터를 다루는 작업은 메모리를 직접 관리해주는 것이 좋다.


  • finalize(소멸자)
public class Test
{
    public Test()
    {
        Console.WriteLine(" Constructor");
    }
    ~Test()
    {
        Console.WriteLine(" Destructor");
    }
}

~키워드가 사용되며, 가비지 컬렉터가 실행될 때에 참조하지 않는 개체(클래스)의 인스턴스인 경우 자동으로 실행된다. 즉, 언제 작동할지 모른다.


  • Dispose
public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

IDisposable을 상속받아 구현해야되며, Dispose 메서드를 통해 소멸한 개체(클래스)는 가비지컬렉션에 포함되지 않아 그만큼 성능 영향이 적다.


  • using 문
var numbers = new List<int>();
using (StreamReader reader = File.OpenText("numbers.txt"))
{
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
}

Dispose의 상위호환(?)이라고 생각한다.
using 문에 포함된 구문들은 구문 실행 후 using의 범위를 벗어나는 순간 Dispose메서드가 실행되어 즉시 메모리해제가 이루어진다.


PS. Dispose메서드와 using 문은 프로그램의 실행 성격에 따라 구분지어 사용해야될 것 같다.

profile
콜라 없는 내 인생은 김빠진 콜라

0개의 댓글