소멸자는 생성자와 연관된 내용이다.
class Person //클래스를 { private string name; private int age; // 매개변수가 없는 디폴트 생성자, 생성 public Person() { name = "Unknown"; age = 0; } // 매개변수를 받는 생성자, 오버로딩 생성 public Person(string newName, int newAge) { name = newName; age = newAge; } public void PrintInfo() { Console.WriteLine($"Name: {name}, Age: {age}"); } } class Main { static void Main (string[] args) { Person person1 = new Person(); Person person2 = new Person("John", 25); } }
- 생성자 이름은 클래스 이름과 동일합니다.
- 생성자는 값을 반환하지 않으므로 반환 유형과 return문이 존재하지 않습니다.
- 생성자를 정의하지 않으면 클래스에서 기본 생성자라고 하는 암시적 생성자를 제공합니다.
언제든 오버로딩이 가능하고, 매개변수도 존재할 수 있으며 사용자가 직접 특정 로직을 사용하여 생성자를 만들 수도 있다!
이후 객체를 호출할때(new), 이 생성자를 이용해 호출된다!
'~'를 클래스의 이름 앞에 붙힌다
namespace asd { class Person { private string name; public Person(string name) { this.name = name; Console.WriteLine(name + "객체 생성!"); } ~Person() { Console.WriteLine(name + "객체 소멸!"); } } class BJ { static void Main(string[] args) { Person person1 = new Person("A"); Person person2 = new Person("B"); Person person3 = new Person("C"); } } } //출력 A갹채 생성! B갹채 생성! C갹채 생성! C객체 소멸! B객체 소멸! A객체 소멸!
이처럼 객체를 만들어 지게 한 귀 소멸하는것을 확인할 수 있다!
근데 소멸하는 순서를 보면, ABC순서가 아닌 CBA순서로 소멸된다이건 GC(가비지콜렉터)가 언제 어떤순서로 소멸시킬지 모르기에, 실행할때마다 소멸되는 순서는 바뀔수 있다!
참고로
GC.Collect()
를 사용하여 소멸자 호출순서를 확인간으!using System.Xml.Linq; namespace asd { class Person { ~Person() { Console.WriteLine("부모 클래스 소멸자 호출!"); } } class Minsu : Person { ~Minsu() { Console.WriteLine("자식 클래스 소멸자 호출!"); } } class BJ { static void sample() { Minsu minsu = new Minsu(); } static void Main(string[] args) { sample(); GC.Collect(); Console.ReadLine(); } } } //출력 자식 클래스 소멸자 호출! 부모 클래스 소멸자 호출!
자식 소멸자 호출 후 부모가 호출됨