Share via


개발자에 따른 메모리 관리

업데이트: 2007년 11월

메모리 관리 작업에 대한 경험은 개발 환경에 따라 다를 수 있으므로 상황에 따라서는 공용 언어 런타임에서 제공하는 자동 메모리 관리 기능에 맞춰 프로그래밍 방식을 변경해야 할 수도 있습니다.

COM 개발자

COM 개발자는 참조 횟수 구현 작업을 수동으로 하는 데 익숙합니다. 개체가 참조될 때마다 카운터가 증가합니다. 개체 참조 횟수가 범위를 벗어나면 카운터가 감소합니다. 개체의 참조 횟수가 0이 되면 개체의 사용이 종료되고 해당 메모리가 해제됩니다.

참조 횟수 체계는 많은 버그의 원인입니다. 참조 횟수 규칙을 정확하게 준수하지 않으면 개체가 중간에 해제되거나 참조되지 않는 개체가 메모리에 축적될 수 있습니다. 순환 참조도 버그의 원인이 될 수 있습니다. 순환 참조는 자식 개체와 부모 개체에서 서로를 참조하는 경우에 발생하며, 이러한 시나리오에서는 두 개체 모두 해제되거나 소멸되지 않습니다. 이 문제를 해결하는 한 가지 방법은 부모와 자식 개체 간에 사용 및 소멸에 대한 고정된 패턴(예: 부모 개체에서 자식 개체를 먼저 삭제)을 지정하는 것입니다.

CLR를 대상으로 하는 언어로 응용 프로그램을 개발할 때 런타임의 가비지 수집기를 사용하면 참조 횟수를 사용할 필요가 없으므로 수동 메모리 관리 체계에서 발생할 수 있는 버그가 생기지 않습니다.

C++ 개발자

C++ 개발자는 수동 메모리 관리와 관련된 작업에 익숙해져 있습니다. C++에서 new 연산자를 사용하여 개체에 대한 메모리를 할당하면 delete 연산자를 사용하여 해당 개체의 메모리를 해제해야 합니다. 이러한 이유로, 개체를 해제하는 것을 잊어 버리면 메모리 누수가 발생하거나 이미 해제된 개체의 메모리에 대해 액세스를 시도하는 등의 오류가 발생할 수 있습니다.

Visual C++ 또는 CLR를 대상으로 하는 기타 언어를 사용하여 응용 프로그램을 개발하면 사용자가 delete 연산자를 사용하여 개체를 해제할 필요 없이 개체가 응용 프로그램에 더 이상 사용되지 않을 때 가비지 수집기가 해당 개체를 자동으로 해제합니다.

수명이 짧은 개체의 메모리를 수동으로 관리하는 데는 메모리가 많이 소요되기 때문에 C++ 개발자는 이러한 개체를 되도록 사용하지 않았습니다. 수명이 짧은 개체에 대해 메모리를 할당하고 해제하는 작업에는 적은 양의 메모리가 소모되는데, .NET Framework의 가비지 수집기는 실제로, 수명이 짧은 개체를 관리하기 위해 최적화되었습니다. 그렇기 때문에, 관리되는 응용 프로그램을 개발할 때 코드를 단순화하기 위해 수명이 짧은 개체를 적절하게 사용하는 것이 좋습니다.

Visual Basic 개발자

Visual Basic 개발자들은 일반적으로 자동 메모리 관리에 익숙합니다. 이전에 사용하던 프로그래밍 방식은 .NET Framework에서 만드는 대부분의 관리되는 개체에 적용됩니다. 그러나 관리되지 않는 리소스를 캡슐화할 때 사용하는 Dispose 메서드에 대해서는 권장되는 디자인 패턴을 사용하는 것이 좋습니다.

.NET Framework에서는 여기에서 설명하는 것보다 더 많은 CLR 대상 언어를 지원합니다. .NET Framework 가비지 수집기는 관리되는 모든 언어에 대해 자동 메모리 관리 기능을 제공합니다. 가비지 수집기는 관리되는 개체에 대한 메모리를 할당하거나 해제하며 관리되지 않는 리소스를 정리하기 위해, 필요에 따라 Finalize 메서드 및 소멸자를 실행합니다. 자동 메모리 관리를 사용하면 수동 메모리 관리 체계를 사용했을 때 발생하는 일반적인 버그를 방지할 수 있어 개발 작업을 단순화할 수 있습니다.

참고 항목

개념

Finalize 메서드 및 소멸자

기타 리소스

가비지 수집