C#/클래스와 객체지향

C# 클래스와 객체지향 - 07. 생성자와 소멸자

tita 2024. 5. 28. 15:39

생성자(Constructor)는 무언가 생성할 때 자동으로 호출되는 메서드입니다.

생성자의 종류는 많지만 우선 인스턴스 생성자에 대해서 알아보겠습니다.

 

인스턴스 생성자는 인스턴스를 생성할 때 자동으로 호출되는 메서드로 다음과 같은 조건이 있습니다.

  • 이름은 클래스 이름과 같아야 합니다.
  • 접근 제한자는 public 이어야 합니다.
  • 반화과 관련된 선언을 하지 않아야 합니다.

다음과 같은 형태가 됩니다.

public [클래스 이름] ([매개변수])
{

}

 

생성자는 일반적으로 인스턴스 변수를 초기화하는 일을 합니다.

간단한 예제를 살펴보겠습니다.

 

class Program
{
    class Product
    {
        public static int counter = 0;
        public int id;
        public string name;
        public int price
        
        public Product(stirng name, int price)
        {
            Product.counter = counter + 1;
            this.id = counter;
            this.name = name;
            this.price = price;
        }
    }
    
    static void Main(string[] args)
    {
        Product productA = new Product("감자", 2000);
        Product productB = new Product("고구마", 3000);
        
        Console.WriteLine(productA.id + " : " + productA.name);
        Console.WriteLine(productB.id + " : " + productB.name);
        Console.WriteLine(Product.counter + "개 생성되었습니다. ");
    }
}

/*
[실행 결과]
1:감자
2:고구마
2개 생성되었습니다.
*/

 

 

생성자로 클래스의 인스턴스를 만들 수 없게 할 때는 private 생성자를 사용합니다.

 

class Program
{
    class Hidden
    {
        private Hidden() { }
    }
    
    static void Main(string[] args)
    {
        Hidden hidden = new Hidden(); // 오류가 발생합니다.
    }
}

 

 

 

[소멸자]

 

생성자는 인스턴스가 생성될 때 실행되는 메서드입니다. 그와 반대로 인스턴스가 소멸될 때에 호출되는 소멸자(Destructor) 가 있습니다.

C#은 변수가 더 이상 사용되지 않을 것이 확실할 때 객체를 소멸시키며 소멸자를 호출합니다.

 

소멸자를 만드는 것에도 규칙이 존재합니다.

  • 이름은 클래스 이름 앞에 ~ 기호가 붙은 것이어야 합니다.
  • 접근 제한자를 사용하지 않습니다.
  • 반환과 관련된 선언을 하지 않습니다.
  • 매개변수와 관련된 선언을 하지 않습니다.
  • 하나의 클래스에는 하나의 소멸자만 있을 수 있습니다.

따라서 아래의 형식이 됩니다.

~[클래스 이름]()
{
}

 

소멸자를 사용하는 코드로 객체 소멸의 출력을 하게 작성해보겠습니다.

 

class Program
{
    class Product
    {
        public string name;
        public int price;
        
        public Product(string name, int price)
        {
            this.name = name;
            this.price = price;
        }
        
        ~Product()
        {
            Console.WriteLine(this.name + "의 소멸자 호출");
        }
    }
    
    
    static void Main(string[] args)
    {
        Product product = new Product("과자", 1000);
    }
}


/*
[실행 결과]
과자의 소멸자 호출
*/