아래와 같은 예시코드
public class MyComponent : Component
{
protected override void Dispose(bool disposing)
{
if (disposing)
{
// 관리되는 리소스를 해제합니다.
}
// 관리되지 않는 리소스를 해제합니다.
base.Dispose(disposing);
}
}
프로그램 initialize 단계에서 위와 같은 코드가 들어간다. 이유는? 메모리 누수를 방지하기 위해.
메모리 누수란?
- 메모리 누수(Memory Leak)는 프로그램이 더 이상 사용하지 않는 메모리를 해제하지 않아서 발생하는 문제입니다.
- 메모리 누수가 발생하면 프로그램이 사용하는 메모리가 계속 증가하여 성능 저하, 심지어 프로그램이 종료될 수 있습니다.
좀 더 넓게 보면 1) Dispose 매서드는 실행하는데 필요한 리소스를 명시적으로 해제하며 메모리 누수도 방지하게 된다. 2) 추가로 컴포넌트의 라이프 사이클을 관리, 즉 객체의 생성, 사용, 해제를 관리하는 의미도 있다. 크게 보면 두 가지 목적이 있는 것.
리소스는 컴포넌트가 실행되는 동안 사용되는 시스템 자원을 일컫는데 예를들면,
- 메모리 : 컴포넌트가 사용하는 객체, 데이터 구조 등을 위해 할당되는 공간
- 파일 핸들 : 컴포넌트가 사용하는 파일, 스트림 등
- 네트워크 연결 : 컴포넌트가 사용하는 소켓, 네트워크 연결 등
- GDI (Graphic Device Interface, Windows 운영 체제에서 그래픽스 출력을 담당하는 API) 리소스 : 컴포넌트가 사용하는 그래픽스 장치 인터페이스 리소스 등
이 있다.
관리되는 리소스와 관리되지 않는 리소스가 구분되는데 관리되는 리소스는 .NET 런타임에 의해 관리되는 리소스이다. 예를 들어, .NET 객체, 배열 등이 관리되는 리소스에 해당하고, 관리되지 않는 리소스는 반대로 .NET 런타임에 의해 관리되지 않는 리소스로, 예를들면 파일 핸들, 네트워크 연결, GDI 리소스 등이 관리되지 않는 리소스에 해당한다.
이러한 리소스 사이클 관리를 하는 dispose매서드를 파이썬에서 구현한다면 아래와 같이 객체 소멸자를 정의할 수 있다.
import contextlib
class MyClass:
def __init__(self):
print("객체가 생성되었습니다.")
def close(self):
print("객체가 해제되었습니다.")
def __del__(self):
print("객체가 소멸되었습니다.")
with contextlib.closing(MyClass()) as obj:
# 객체 사용
pass
파이썬 프로그래밍에서도 이러한 리소스 관리가 필요할까?
댓글 없음:
댓글 쓰기