본문 바로가기
프로그래밍언어 & 프레임워크/C#

C# 소멸자(Destructor)

by 공부하는개미 2021. 6. 5.
반응형

아래 글은 C# 소멸자(Destructor) 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 36단원 소멸자 482 ~ 488페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 36. 네임스페이스]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

 

https://www.youtube.com/watch?v=Ls88lTcYVkU 

 

 

 

 

✳ 소멸자(Destructor)

 

 

  • 생성자와 반대 개념으로 클래스로부터 인스턴스화된 개체가 메모리 상에서 없어질 때 발생하는 메서드
  • C#에서는 .NET Framework의 GC(Garbage Collector)가 개체 소멸 시 메모리 해제 등의 역할을 대신해 주기
    때문에 직접 접근 할 일은 없음
  • 자동차 시동 끄는 기능으로 비유가 가능하며 운전수가 주차하고 시동 끄는 행위를 진행하는 게 아닌
    주차요원(GC)이 모든 것을 대신 해주는 것과 의미가 같음

 

 

 

✳ 가비지 수집기(Garbage Collector)

 

 

  • 자동차(Car) 개체와 관련하여
    -> 소멸자: 좋은 호텔 앞에서의 주차요원 열학
     => 왜?
       - 키를 받고 알아서 시동을 꺼주니까?
  • 값 형과 참조형의 할당된 자원 관리 비교

 

 

 

 

✳ 개체의 라이프 사이클(Object Life Cycle)

 

 

  • 메모리 할당
    - new 키워드
  • 개체 초기화
    - 생성자(Constructor)에 의한 개체 생성 / 초기화
  • 개체 사용
    - 속성, 메서드 및 기타 멤버 사용
  • 개체 소멸
    - 소멸자에 의한 개체 정리
  • 메모리 반환

 

 

✳ 값 형과 참조형 메모리 자원 관리 비교

 

 

 

  • 값 형(Value Type)
    - Stack에 저장됨
     -> LIFO: 나중에 만들어진 변수부터 먼저 소멸됨
    - 해당 범위(Scope)를 벗어나면 자동으로 소멸됨
    - 메모리 단편화(memory fragmentation)가 없음
  • 참조형(Reference Type)
    - Heapp에 저장됨
      -> FIFO
    - 동일 개체를 여러 번 참조 가능
    - 하나라도 참조하고 있으면 소멸되지 않음
      -> 메모리 단편화(memory fragmentation)의 원인이 될 수 있음
    - 가비지 컬렉터(Garbage Collector)에 의해 관리 됨

 

 

 

 

 

 

 

✳ 예제코드

// 메서드: 동작/행위 : 자동차의 동작/기능
// 생성자(Constructor) 메서드: 클래스에서 제일 먼저 실행, 자동차 조립/시동걸기
// 소멸자(Desctructor) 메서드: 클래스에서 제일 마지막에 실행, 자동차 폐차/시동끄기
using System;

namespace 생성자_메서드_소멸자
{
    public class Car
    {
        // 필드
        private string color;
        // 생성자
        public Car()
        {
            color = "검정";
            Console.WriteLine("{0}색 자동차를 조립합니다.", color);
        }
        public Car(string color)
        {
            this.color = color; // this.필드 = 매개변수;
            Console.WriteLine("{0}색 자동차를 조립합니다.", color);
        }
        // 메서드
        public void Go()
        {
            Console.WriteLine("{0}색 자동차가 달립니다.", color);
        }
        // 소멸자: GC 엔진 알아서 소멸시킴
        ~Car()
        {
            Console.WriteLine("{0}색 자동차를 폐차합니다.", this.color);
        }
    }
    class 생성자_메서드_소멸자
    {
        static void Main()
        {
            // Car 클래스의 인스턴스 생성
            Car car = new Car(); // 생성
            car.Go(); // 호출

            // 폐차: 시점을 알 수 없다. GC 엔진이 알아서 실행

            // 매개변수가 있는 생성자를 호출
            Car whiteCar = new Car("하얀");
            whiteCar.Go();

            Car blueCar = new Car("파랑");
            blueCar.Go();
        }
    }
}
반응형