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
    반응형
상단으로