CS/C#

[C#] 생성자와 소멸자

Mirab 2021. 12. 11. 23:32

객체를 생성하고 만드는 과정에서 사용되는 생성자와, 언젠간 객체도 사용되지 않는다면 소멸하므로 소멸할 때 사용하는 소멸자에 대해서 알아보겠습니다.

# 생성자

이름 그대로 생성할 때 호출되는 녀석입니다.

생성자의 임무는 클래스의 객체를 생성하는 것이며, 동시에 스페셜하게 readonly도 초기화가 가능합니다.

class Name
{
    public int a;
    public int b;

    public Name()
    {
        // 디폴트 생성자
    }

    public Name(int a, int b)
    {
        // 매개변수를 입력받아 원하는 값으로 초기화
        this.a = a;
        this.b = b;
    }
}

클래스를 선언할 때 명시적으로 생성자를 구현하지 않아도 객체가 생성이 됩니다. 그 이유는 컴파일러에게 디폴트 생성자를 만들어주기 때문입니다.

 

디폴트 생성자를 지원하더라도, 객체를 생성하는 시점에서 맛있는 붕어빵을 만들 때 물가로 인해 가격이 상승해서 만들 때 가격을 올린다거나, 맛을 바꾼다거나, 이름을 바꾸는 등 사용자가 원하는 필드의 값으로 바꾸고 싶은 경우가 있습니다.

 

그럴 때 매개변수를 입력받아 원하는 값으로 초기화를 할 수 있도록 생성자를 오버 로딩이 가능합니다.

오버 로딩이름은 동일하지만 매개변수의 다양한 유형의 호출에 응답할 수 있게 작성할 수 있습니다.

 

생성자클래스의 필드를 초기화할 수 있는 최적의 장소라고 할 수 있습니다.

 

다만 주의할 점은 프로그래머가 생성자를 하나라도 직접 정의한다면 C# 컴파일러는 매개변수가 없는 디폴트 생성자를 제공하지 않기 때문에 디폴트 생성자도 사용한다면 직접 정의해야 합니다.

# 소멸자(종료자)

객체도 언젠간 우리처럼 죽는 날이 옵니다.

그러면 그 객체가 가지고 있던 자원을 모두 반납하고 하늘로 가겠죠. 하늘로 가기 전에 자원을 반납하거나 뒷정리를 하는 공간입니다.

 

신기한 게 소멸자는 생성자와 달리 매개변수도 없고, 한정자(public, private, protected)도 사용하지 않습니다.

또한 같은 이름의 유형을 다르게 하여 지정하는 오버 로딩도 지원하지 않습니다.

 

이 소멸자는 CLR의 가비지 컬렉터가 객체를 소멸되는 시점을 판단해서 호출합니다. (사용자가 호출할 수 없습니다!)

~Name()
{
    Console.WriteLine("바이바이 세상");
}

C++에서는 동적으로 할당된 메모리를 해제하는 공간에서 사용하는 개념이지만, C#에서는 가급적 사용하지 않는 것이 좋습니다.??

 

C#은 C++과 다르게 메모리 관리를 GC라는 가비지 컬렉터가 대신해줍니다. 그래서 편리하지만, CLR의 가비지 컬렉터가 언제 동작할지 예측할 수 없다는 것이 단점입니다.

 

자세한 방법은 추후에 작성할 것이지만 간단하게 말하면, GC는 쓰레기가 생긴다고 바로 치우지 않습니다.

어느 정도 양에 이르러야 동작합니다. 그래서 문제는 쓰레기가 차오르는 시간을 정확하게 알 수 없을뿐더러 가비지 컬렉터의 동작할 시점도 알 수 없기 때문에 소멸자에서 우리가 원하는 행동을 객체가 소멸된다고 해서 바로 얻어올 수 없다는 것이 문제가 됩니다.

 

소멸자를 명시적으로 구현하면, 가비지 컬렉터는 클래스의 족보를 타고 올라가 객체로부터 상속받은 Finalize() 메서드를 호출하게 되는데 이때 응용 프로그램의 성능 저하를 초래할 확률이 높아 권장하지 않는다고 합니다.

 

또, 생각보다 CLR의 가비지 컬렉터는 사용자보다 더 똑똑하게 객체의 소멸을 처리하고 있기 때문에

사용자는 생성자만 신경 쓰고, 뒤처리는 GC에게 맡기는 것이 좋습니다.

 

!!! 정말 중요한 점은 객체가 소멸될 때 어떤 순서로 소멸시킬지에 대한 보장이 없고 이는 매 실행마다 달라질 수 있다는 것입니다. (먼저 소멸되더라도 나중에 소멸된 객체보다 더 늦게 처리될 수 있다는 뜻)

 

오늘은 코드에 중점적이기보다는 생성자와 소멸자가 C#에서는 어떻게 사용되고 있으며, 객체의 소멸과정은 GC라는 가비지 컬렉터가 수행하고 있다는 점을 알았습니다.

'CS > C#' 카테고리의 다른 글

[C#] 인터페이스와 추상 클래스  (0) 2021.12.20
[C#] 정적 필드와 메서드(static)  (0) 2021.12.12
[C#] 클래스  (0) 2021.12.11
[C#] 문자열 찾기 함수들  (0) 2021.12.10
[C#] var  (0) 2021.12.10