재우니의 블로그




생성자는 저번에 소개했고요. 이번에는 반대말인 소멸자에 대해서 설명을 할려고 합니다. 그럼 소멸자는 무엇일까요? 한마디로 객체를 더 이상 사용할 필요가 없을 때 부르게 되는데요. 자바에도 있지만, c#에도 가비지컬렉터이 있답니다. 영어로 garbage collector 라고 하네요. 쓰레기 수집가라..ㅋㅋ

역할은 제거하거나 할당했던 것들을 풀어주는 역할입니다. 알아서 쓰레기 수집가가 소멸자를 불러서 처리 해준다고 하네요. 언제 불러줄지는 다들 말씀들이 제각기라~ 저도 뭐라고 말할 수가 없네요. 아시는 분은 답변을 주세요.

뭐..강제로 쓰레기 아저씨를 부를 수도 있어요. System.GC.Collect() 메소드가 있기는 한데요. 알아서들..ㅎㅎㅎ



■ 그럼 소멸자 선언 모양 형태가 어떻게 생겼는지 살펴보죠.

~Car()
{
}



흠..."~"을 클래스이름 앞에 붙여줍니다. 자세히 보니 접근제한자도 안보이고, void, int, string 등 리턴 type 도 안보이고요. 왜냐면 소멸자는 항상 public 접근제한자 입니다. 별도로 지정하지 못하도록 되어 있다고 해요.

가끔 인자값도 넣어 줄수 있냐고 물어보는 분들을 위해서, 인자를 넘길 수 있다고 해도 별 뜻이 없기 때문에 생성자와는 달리 소멸자는 인자를 거절합니다. ^^;

짧은 소스니까..이미지가 아닌 text 로 제가 간단히 코딩할께요.

using System;

class Car
{
    public Car() //나는 생성자..
   { 
          Console.WriteLine("여기는 csharp.zoa.to 사이트입니다."); 
   }

  ~Car() // 나는 소멸자
  {
  }
}

class CarTest
{
      static void Main()
      {
            Car c = new Car(); //생성자
       }
}


결과값은 

여기는 csharp.zoa.to 사이트입니다.


라고 출력이 됩니다.



■ garbage collector 설명을 하겠습니다.


저희가 new 연산자를 이용하여 많은 객체들을 생성했다고 하죠.
그러면 이런 객체들을 사용하지 않을 경우 객체를 파리잡듯이 없애야 하는데요. 안그러면 메모리가 부족해서 에러가 발생될 수도 있는데 말이죠.

"홍반장" 영화 보셨나요? 마치 홍반장이 언젠가 나타나 객체들을 일일이 검사하여 메모리에서 없애버립니다. 홍반장 역할을 garbage collector 가 하는것이죠. 편리하죠? 뭐~~ 장단점이 있겠죠.ㅎㅎ

앞으로 차세대 언어들은 이러한 식으로 홍반장을 부르게 하는 방법을 택할거라 생각이 드네요.
사실 GC.Collect 메소드를 호출해서 필요 없는 메모리를 제거할 수는 있답니다.

소스 구현은 아래와 같아요.

public void Dispose()
{
          //일련의 소멸 작업들..
}



좀 짜증나지만 Dispose() 메소드를 기재하여 호출해 줘야 한다는 점인데요.
이는 홍반장이 나타나기 전에 헤체해 줄 수 있다는 점이죠.

이것 말고요요. interface 의 IDisposable 이 있답니다. 차후에 설명드리죠.


posted by  심재운( shimpark@gmail.com)