SSISO Community

갤러리정

가비지컬렉션 - Finalize, Close , Dispose - CSharp

가비지 컬렉션(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("프로그램종료");
            }
        }


1264 view

4.0 stars