C#에서 소멸자(Destructor)는 클래스에 속한 특수한 멤버 함수로, 해당 클래스의 객체가 범위를 벗어나 소멸될 때 자동으로 실행되는 메서드입니다. 주로 객체가 사용하던 리소스를 정리하는 용도로 활용됩니다.
소멸자의 기본 문법
소멸자는 클래스 이름 앞에 물결표(~)를 붙여 정의합니다. 예를 들어 클래스 이름이 Demo라면 소멸자는 ~Demo() 형태가 됩니다.
public Demo() { // 생성자
Console.WriteLine("객체가 생성되고 있습니다");
}
~Demo() { // 소멸자
Console.WriteLine("객체가 삭제되고 있습니다");
}소멸자의 특징
- 클래스 하나당 소멸자는 최대 하나만 정의할 수 있으며, 오버로딩이 불가능합니다.
- 매개변수와 접근 제한자(public, private 등)를 가질 수 없습니다.
- 소멸자는 프로그래머가 직접 호출할 수 없으며, .NET의 가비지 컬렉터(Garbage Collector)가 객체를 회수할 때 자동으로 호출됩니다.
- 구조체(struct)에는 소멸자를 정의할 수 없고, 클래스(class)에서만 사용 가능합니다.
C# 소멸자 예제 코드
다음 예제를 통해 C#에서 소멸자가 실제로 어떻게 동작하는지 확인해 보겠습니다.
using System;
namespace LineApplication {
class Line {
private double length; // 선의 길이
public Line() { // 생성자
Console.WriteLine("객체가 생성되고 있습니다");
}
~Line() { // 소멸자
Console.WriteLine("객체가 삭제되고 있습니다");
}
public void setLength(double len) {
length = len;
}
public double getLength() {
return length;
}
static void Main(string[] args) {
Line line = new Line();
// 선 길이 설정
line.setLength(6.0);
Console.WriteLine("선의 길이 : {0}", line.getLength());
}
}
}실행 결과
객체가 생성되고 있습니다 선의 길이 : 6 객체가 삭제되고 있습니다
실행 결과 분석
출력 결과를 보면 프로그램 흐름은 다음과 같습니다.
Main메서드에서new Line()으로 객체를 생성하는 순간 생성자가 호출되어 "객체가 생성되고 있습니다"가 출력됩니다.setLength(6.0)으로 길이를 설정하고,getLength()로 값을 출력합니다.- 프로그램이 종료되면서 객체가 더 이상 참조되지 않으면, 가비지 컬렉터가 객체를 회수하며 소멸자가 실행되어 "객체가 삭제되고 있습니다"가 출력됩니다.
정리
C#의 소멸자는 객체 수명이 끝날 때 리소스를 해제하기 위한 장치입니다. 다만 C#에서는 가비지 컬렉션이 메모리 관리를 대부분 자동으로 처리해 주기 때문에, 소멸자보다는 파일 핸들, 네트워크 연결 등 비관리(unmanaged) 리소스를 다룰 때 한정적으로 사용하는 것이 좋습니다. 일반적인 리소스 정리에는 IDisposable 인터페이스와 using 문을 활용하는 것이 권장됩니다.