프로그래밍 언어/C#

생성자(Consturctor)와 소멸자(Destructor)

gcreators 2024. 9. 5. 17:28

C#에서는 메모리를 우리가 직접 관리 할 수 없다( Garbage Collection )

 

그렇기에 효율적인 프로그램을 위해서 개발자에게는 객체라는 것에 대한 올바른 이해와 사용이 필수적인데

객체의 생성주기(LifeCycle)에는 생성자와 소멸자라는 필수적인 두 기능이 있다.

이를 이해하고 있으면 메모리 관리를 효과적으로 할 수 있을 것 이다.

 

생성자 및 소멸자는

반환형이 없고 이름은 클래스명과 같다. 이런 형태로 임의로 호출을 안하는 것이 기본(default)이다.(자동 호출됨)

하지만 공부를 위해 지금은 호출한다.

//Character.cs

class Character
{
    //생성자(Constructor)
    public Character()
    {
        Console.WriteLine("Character Constructor Call!");

        hp = 100;
        mp = 20;
        exp = 0;
        lv = 1;
        //※ 사실 유니티에서는 생성자를 사용 할 일이 많이 없다.
    }
    //소멸자(Destructor)
    ~Character()
    {
        Console.WriteLine("Character Desturctor Call!");
    }
}

 

생성자는 클래스의 인스턴스(Instance)가 생성되면 자동으로 호출된다.

클래스를 정의 할 때 생성자는 객체가 어떻게 초기화 되는지 결정 할 수 있다.

 

소멸자는 객체가 메모리에서 제거 될 때 자동으로 실행되는 함수 이다.

소멸자 역시 클래스명과 같지만 앞에 '~' 가 붙는다.

소멸자는 매개변수를 가질 수 없고 클래스당 하나만 존재 할 수 있다.

 

//Program.cs

class Program
{
    static void Test()
    {
        Character mob = new Character();
    }

    static void Main()
    {
        //객체(Object)
        //인스턴스화 Instance, Instantiate - 클래스로 객체를 만드는 과정
        Character player = new Character();//C#에서는 객체를 사용하려면 무조건 동적할당을 해야 한다.
        //동적할당을 하지 않을거면 null을 붙여놔야함
        //player객체의 변수에 접근하려면 .을 통해 해야한다.
        player.hp = 100;
        player.Damage(10);
        Console.WriteLine("Player.hp: " + player.GetHP());
        player.MP = 10;
        //player. -> 접근 지정자 private이랑 protected 에는 접근 안되는 것을 확인

        Test();
        GC.Collect();//가비지 컬렉션
        Console.ReadLine();//가비지 컬렉션이 탐색하는 동안 잠시 기다리는 용도의 코드
    }
}

처음에 player라는 이름으로 객체가 동적할당 되면서 생성자가 호출된다

그리고 후에 Test함수를 이용해 mob이란 이름의 객체가 생성되며 생성자가 호출, 그리고 가비지 컬렉션이 돌아가며

해당 객체를 할당해제하며 소멸자가 호출 되는 모습니다.

 

이 처럼 생성자와 소멸자를 통해 효율적인 프로그램을 짤 수 있도록 해야한다.