Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 소멸자(Destructor)란 무엇인가? 개념과 예제로 쉽게 이해하기

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
객체가 삭제되고 있습니다

실행 결과 분석

출력 결과를 보면 프로그램 흐름은 다음과 같습니다.

  1. Main 메서드에서 new Line()으로 객체를 생성하는 순간 생성자가 호출되어 "객체가 생성되고 있습니다"가 출력됩니다.
  2. setLength(6.0)으로 길이를 설정하고, getLength()로 값을 출력합니다.
  3. 프로그램이 종료되면서 객체가 더 이상 참조되지 않으면, 가비지 컬렉터가 객체를 회수하며 소멸자가 실행되어 "객체가 삭제되고 있습니다"가 출력됩니다.

정리

C#의 소멸자는 객체 수명이 끝날 때 리소스를 해제하기 위한 장치입니다. 다만 C#에서는 가비지 컬렉션이 메모리 관리를 대부분 자동으로 처리해 주기 때문에, 소멸자보다는 파일 핸들, 네트워크 연결 등 비관리(unmanaged) 리소스를 다룰 때 한정적으로 사용하는 것이 좋습니다. 일반적인 리소스 정리에는 IDisposable 인터페이스와 using 문을 활용하는 것이 권장됩니다.