가비지 컬렉션(Garbage Collection)
- 메모리 할당 과정
- 메모리 누수 & 객체 손상
Finalize & 소멸자(Destructor)
- 가비지 컬렉터가 객체 소멸시 객체의 Dinalize메소드를 호출후 객체 메모리를 반환
- Finalize와 소멸자는 같다
- ~클래스명()
class Human
{
public static int num = 0;
public Human()
{
Console.WriteLine("Human객체가 생성됩니다");
Console.WriteLine("Human수: " + ++num);
}
~Human()
{
// 소멸자는 접근권한이 항상 public이어야 하기때문에 별도로 접근권한을 지정하지 못하도록 되어있다.
// 값도 리턴할수 없어서 리턴형도 지정못함.
// 생성자와 다른점은 파라미트를 받아들일수 없다는 점이다.
//일반적으로 자원을 반환하고자 할경우 사용
Console.WriteLine("Human 객체가 죽습니다.");
Console.WriteLine("Human수: " + --num);
}
}
class MainClass{
[STAThread]
static void Main(string[] args)
{
Human man1 = new Human();
Human man2 = new Human();
Human man3 = new Human();
Human man4 = new Human();
Human man5 = new Human();
Console.WriteLine(Human.num);
}//Main이 끝나는 시점에서 강제정리
}
객체의 강제정리
- Close & Dispose
- Close : 객체를 계속 사용해야 하는 경우(DB 연결...)
- Dispose : 더이상 객체 사용이 불필요한 경우
- Close나 Dispose가 호출되면 더이상 Finalize가 호출될 이유가 없기때문에 호출을 명시적으로 막는 처리를 한다 -> GC.SuppressFinalize
class csDispose : IDisposable //Dispose메소드 구현 가능하게 함.
{
public csDispose()
{
Console.WriteLine("Human 객체가 생성됩니다");
}
~csDispose() //Finalize
{
//Dispose 메소드와 리스소 해제하는 코드가 중복됨.
if(!isDispose)
{
Dispose();
//Dispose메소드가 호출된적이 있는지 살펴본다.
//호출된적이 있다면 GC.SuppressFinalize가 호출되었을것이므로 finalize메소드를 실행시키지 않는다.
}
else
{
Console.WriteLine("Human 객체가 죽습니다");
}
}
public void Dispose() //리소스를 해제함
{
Console.WriteLine("Dispose 실행");
GC.SuppressFinalize(this); //~csDispose() 메소드를 호출하지 못하도록 설정함.
}
}
class MainClass
{
[STAThread]
static void Main(string[] args)
{
csDispose cd = new csDispose();
cd.Dispose(); //Dispose 호출
Console.WriteLine("프로그램종료");
}
}