프로그래밍 언어/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이란 이름의 객체가 생성되며 생성자가 호출, 그리고 가비지 컬렉션이 돌아가며
해당 객체를 할당해제하며 소멸자가 호출 되는 모습니다.
이 처럼 생성자와 소멸자를 통해 효율적인 프로그램을 짤 수 있도록 해야한다.