Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!시작하기

Microsoft. NET 을 시작하는 분들을 위한 강좌입니다. 주로 기초적인 내용과 때론 기본적인 내용을 다룹니다

생성자/소멸자의 호출 매커니즘

작성자 : 박종명
최초 작성일 : 2008-06-16 (월요일)
최종 수정일 : 2008-06-16 (월요일)
조회 수 : 3456

* 생성자/소멸자의 호출 매커니즘

 

객체가 생성될 때 최초로 실행되는 생성자와 객체가 소멸될 때 호출되는 소멸자의 호출 매커니즘에 대해 알아보자.

특히 상속관계에 있는 클래스의 호출 매커니즘을 알아본다.

닷넷 프레임웍에서 만드는 모든 클래스는 기본적으로 System.Object 클래스로부터 상속받게 된다.

(프로그래머가 상속을 지정하지 않았다고 해도 묵시적으로 상속된다)

따라서 모든 클래스는 한 단계 상속을 받은 셈이 된다.

 

1. 생성자의 호출 순서

 

다음과 같은 상속구조의 클래스를 가정해 보자.

class Parent

{

        public Parent()

        {

               Console.WriteLine("Parent 의 기본생성자");

        }

}

class Child : Parent

{

        public Child()

        {

               Console.WriteLine("Child 의 기본생성자");

        }

}

 

이와 같이 클래스가 정의되어 있을 때,

Child child = new Child()

Child 객체를 생성하면 다음과 같이 생성자가 호출된다.



Child 객체를 생성할 때 부모 클래스(Parent) 의 생성자가 먼저 호출되었다.

이 말은 Child 객체가 생성되기 전에 Parent 객체가 먼저 생성됨을 알 수 있다. 사실 여기서 또 한가지 더 있다.

System.Object 객체가 제일 먼저 생성된다는 것이다. 모든 클래스는 System.Object 로부터 상속받기 때문에 이 클래스가 최상위 부모 클래스가 된다. 따라서 최상위 부모 클래스의 객체가 먼저 생성되고 그 다음 부모.. 이런식으로 진행되는 것이다.



2. 소멸자 호출 순서

 

상속구조에서의 소멸자의 호출 순서는 생성자와는 정반대이다. 자식 객체부터 소멸되고 점차 상위로 올라가는 순서를 가진다. 테스트를 위해 아래처럼 코드를 수정하자(소멸자 코드를 추가하자).

 

class Parent

{             

        ~Parent()

        {

               Console.WriteLine("Parent 의 소멸자");

        }

}

class Child : Parent

{             

        ~Child()

        {

               Console.WriteLine("Child 의 소멸자");

        }

}

 

그리고 다음과 같이 테스트를 위한 Main 코드를 작성하자.

static void Main(string[] args)

{

        Child child = new Child();

 

        child = null;

        GC.Collect();

        GC.WaitForPendingFinalizers();

        Console.ReadLine();

}

 

Child 객체를 생성한 후 가비지 수집을 위해 unreachable(도달할수 없는) 객체로 만들고 가비지 수집을 강제로 일어나도록 한다. 결과는 다음과 같다.



생성자의 순서와는 반대로 Child 부터 소멸되고 Parent 가 소멸된다.

그리고 최종적으로 System.Object 가 소멸될 것이다.


3. 생성자 호출에 개입하기(this / base 키워드)

 

this

자기자신의 특정 생성자 먼저 호출

base

부모 클래스의 특정 생성자 명시적으로 호출

 

//Parent 는 기본 생성자이외에 다음과 같은 생성자를 하나 더 가진다

public Parent(int i)

{

        Console.WriteLine("Parent(int) 생성자");

}

 

class Child : Parent

{

        public Child() : base(1)

        {

               Console.WriteLine("Child 의 기본생성자");

        }                            

}

Child의 기본생성자에서 Parent Parent(int i) 생성자를 호출하도록 명시하고 있다.

이렇듯 base 키워드를 사용하면 부모 클래스의 특정 생성자를 지정하여 호출 할수 있다

 

다음으로 this 를 살펴보자

class Child : Parent

{

        public Child() : this(1)

        {

               Console.WriteLine("Child 의 기본생성자");

        }      

        public Child(int i)

        {

               Console.WriteLine("Child(int) 생성자");

        }             

}

Child 기본생성자에서 자기자신의 Child(int i) 생성자를 호출하도록 명시하고 있다.

이렇게 하면 Child() 생성자(기본생성자) 가 호출되기 전에 Child(int i) 생성자가 먼저 호출된다.

이렇듯 this 키워드를 사용하면 자기자신의 여러 생성자 중 먼저 수행되어야 할 특정 생성자를 지정할 수 있다.

이름
비밀번호
홈페이지
GC <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요