Language/C# [C#] 생성자와 소멸자(Constructor and Destructor)
  • 728x90
    반응형

     

     

     

     

    생성자와 소멸자 (Constructor and Destructor)


     

     

    목차

       

       

      생성자 (Constructor)

      📌 생성자는 객체를 생성할 때 호출되는 메소드이며, 소멸자는 객체를 소멸시킬 때 호출되는 메소드라고 할 수 있다. 생성자의 선언 형식은 아래와 같다.

       

      생성자의 일반적인 선언형식 :

      class 클래스명 { 

          [접근제한자] 클래스명(매개변수..)
          {
               //
          }
          ...
      }

       

      생성자의 이름은 클래스의 이름과 똑같다. 그리고 이 생성자의 메소드와 같이 매개변수를 가질 수 있으며, 메소드와는 달리 특정 값을 반환할 수 는 없고, 반환형도 가지고 있지 않다. 생성자는 객체 생성시 호출되는 메소드이며, 따로 생성자를 구현해주지 않아도 컴파일러에서 생성자를 직접 만들어 준다. 즉 자동으로 기본 생성자(default constructor)가 생성된다는 것이다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Car
          {
              private int maxSpeed;
              private int speed;
              private string model;
              
              public Car(int maxSpeed, string model)
              {
                  this.maxSpeed = maxSpeed;
                  this.model = model;
              }
      
              public void ShowCarInfomation()
              {
                  Console.WriteLine(model + "의 현재 속도: " + speed + "km/h, 최대 속도: " + maxSpeed + "km/h");
              }
      
              public void speedUp(int increment)
              {
                  if (speed + increment > maxSpeed)
                      Console.WriteLine("최대 속도" + maxSpeed + "km/h를 넘길 수 없습니다.");
                  else
                  {
                      speed += increment;
                      Console.WriteLine(model + "의 현재 속도는 " + speed + "km/h 입니다.");
                  }
              }
      
              public void speedDown(int dcrement)
              {
                  if (speed - dcrement < 0)
                      Console.WriteLine("속도는 0 아래로 떨어질 수 없습니다.");
                  else
                  {
                      speed -= dcrement;
                      Console.WriteLine(model + "의 현재 속도는 " + speed + "km/h 입니다.");
                  }
              }
          }
      
          class Program
          {
              static void Main(string[] args)
              {
                  Car car = new Car(325, "람보르기니 가야르도");
      
                  car.ShowCarInfomation();
                  car.speedUp(50);
                  car.speedUp(40);
                  car.speedUp(210);
                  car.speedUp(30);
              }
          }    
      }

       

      결과)

      람보르기니 가야르도의 현재 속도: 0km/h, 최대 속도: 325km/h
      람보르기니 가야르도의 현재 속도는 50km/h 입니다.
      람보르기니 가야르도의 현재 속도는 90km/h 입니다.
      람보르기니 가야르도의 현재 속도는 300km/h 입니다.
      최대 속도325km/h를 넘길 수 없습니다.
      계속하려면 아무 키나 누르십시오 . . .

       

      생성자에서 매개변수로 정수형 값 하나와, 문자열 값 하나를 받는 부분이 있는 것을 확인할 수 있다. 매개변수 maxSpeed의 값을 멤버 변수 maxSpeed에 넣고, 매개변수 model의 값을 멤버 변수 model에 넣는다.

       

      생성자도 오버로딩이 가능하다. 아래 예는 생성자 오버로딩 사용 예이다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class MyClass
          {
              public MyClass()
              {
                  Console.WriteLine("매개변수가 없는 디폴트 생성자");
              }
      
              public MyClass(int a)
              {
                  Console.WriteLine("정수형 매개변수");
              }
      
              public MyClass(double a)
              {
                  Console.WriteLine("실수형 매개변수");
              }
          }
      
          class Program
          {
              static void Main(string[] args)
              {
                  MyClass ma = new MyClass();
                  MyClass mb = new MyClass(10);
                  MyClass mc = new MyClass(25.5);
              }
          }    
      }

       

      결과)

      매개변수가 없는 디폴트 생성자
      정수형 매개변수
      실수형 매개변수
      계속하려면 아무 키나 누르십시오 . . .

       

      생성자에는 메소드 오버로딩 규칙이 그대로 적용된다.

       

       

      소멸자 (Destructor)

      소멸자는 생성자와 달리 가비지 컬렉터(garbage collector)에 의해 객체가 소멸하는 시점을 판단하여 호출되는 메소드이다. 여기서 가비지 컬렉터란, C#에서 효율적인 메모리 관리를  위해 가비지 컬렉터가 자동으로 더는 사용되지 않는 객체를 수거해 간다. 소멸자는 생성자와 달리 상속되거나 오버로드 될 수 없으며, 사용자가 호출할 수도 없다.

       

      소멸자의 사용 형태:

      class 클래스명()
      {
           ~클래스명()
          {
              //
          }
          ..
      }

       

      위에서 보는거와 같이 클래스의 이름 앞에 ~ 기호를 붙인게 소멸자이다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class MyClass
          {
              private string name;
      
              public MyClass(string name)
              {          
                  this.name = name;
                  Console.WriteLine(name + "객체 생성!");
              }
      
              ~MyClass()
              {
                  Console.WriteLine(name + "객체 소멸!");
              }
          }
      
          class Program
          {
              static void Main(string[] args)
              {
                  MyClass ma = new MyClass("A");
                  MyClass mb = new MyClass("B");
                  MyClass mc = new MyClass("C");
              }
          }    
      }

       

      결과)

      A객체 생성!
      B객체 생성!
      C객체 생성!
      C객체 소멸!
      B객체 소멸!
      A객체 소멸!
      계속하려면 아무 키나 누르십시오 . . .

       

      위 예제를 보면 a, b, c, 객체가 만들어진 뒤에 소멸하는 것을 확인할 수 있다. 그런데 소멸하는 순서를 보면 a, b, c가 아닌 c, b, a 순으로 소멸된다. 이것은 가비지 컬렉터가 언제 움직일지, 어떤 순서로 소멸시킬지 모르기 때문에, 실행할 때마다 소멸되는 순서는 바뀔수 있다.

       

       

       

       

      728x90
      반응형
    상단으로