C# 프로그래밍 11번째 시간 - 생성자와 소멸자

유니티의 열한걸음, C# 공부시작 45일차

오늘은 객체에 연관된 내용으로 가장 중요한 생성자와 소멸자 (Constructor & Destructor) 에 대해서 배우겠습니다!
생성자객체를 생성할때 호출하는 메소드이고, 소멸자객체를 소멸할때 호출되는 메소드입니다.
생성자를 먼저 알아보겠습니다.

1. 생성자

일단 생성자의 선언 형식은 이렇습니다.

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

이를 통해, 생성자의 특징을 정리해보겠습니다!

  • 생성자의 이름은 클래스의 이름과 똑같다.
  • 메소드와 같이 매개변수를 가질 수 있다.
  • 메소드와는 달리 특정 값을 반환할 수는 없고, 반환형도 가지고 있지 않는다.
  • 따로 생성자를 구현해주지 않아도 컴파일러에서 직접 만들어준다.

즉, 우리가 생성자를 만들지 않아도 자동으로 기본 생성자가 만들어집니다!!
그럼 생성자를 이용하여 예제를 만들어보겠습니다!

[생성자를 활용한 예제 - 자동차의 속도]

using System;

namespace Study
{
	class Car
	{
		private int maxSpeed;
		private int speed = 0;
		private string model;
		public Car(int maxSpeed, string model)
		{
			this.maxSpeed = maxSpeed;
			this.model = model;
		}
		public void ShowCarInformation()
		{
			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 decrement)
		{
			if (speed - decrement < 0)
			Console.WriteLine("속도는 0 아래로 떨어질 수 없습니다.");
			else
			{
				speed -= decrement;
				Console.WriteLine(model + "의 현재 속도는 " + speed + "km/h 입니다.");
			}
		}
	}
	class Program
	{
		static void Main(string[] args)
		{
			Car car = new Car(325, "타요");
			car.ShowCarInformation();
			car.speedUp(50);
			car.speedUp(40);
			car.speedUp(210);
			car.speedUp(30);
		}
	}
}

여기서 나온 결과는 이러합니다.

타요의 현재 속도: 0km/h, 최대 속도: 325km/h
타요의 현재 속도는 50km/h 입니다.
타요의 현재 속도는 90km/h 입니다.
타요의 현재 속도는 300km/h 입니다.
최대 속도 325km/h를 넘길 수 없습니다.

여기서 public Car(int maxSpeed, string model) 이 부분이 생성자부분이라고 할 수 있습니다.
매개변수로 정수형 값 하나, 문자열 값 하나를 받는 부분이 있는 것을 확인할 수 있습니다.
매개변수 maxSpeed의 값을 멤버 변수 maxSpeed에 넣고, 매개변수 model의 값을 멤버 변수 model에 넣습니다.

그리고 메인 클래스에서, 객체를 생성 후 325라는 값과 타요라는 문자열 값이 넘어갔습니다.
이를 통해 객체를 생성할 때 생성자가 호출되면서 멤버 변수를 초기화하고 있습니다.
객체를 생성하는 부분은 이러합니다.

클래스명 객체명 = new 생성자;

생성자는 일반적으로 객체를 생성하면서 멤버 변수를 자신이 원하는 값으로 초기화하는 부분이 들어갑니다.
또 중요한 것 중 하나로, 생성자는 오버로딩을 할 수 있습니다.
예제를 한번 만들어보겠습니다!

[생성자의 오버로딩 예제]

using System;

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

이에 따른 결과는

매개변수가 없는 디폴트 생성자
정수형 매개변수
실수형 매개변수

로 나옵니다.

마지막 부분에 ma,mb,mc라는 객체를 생성하면서 MyClass 생성자를 호출합니다.
넘어가는 매개변수의 형태와 수에 따라 실행되는 영역을 이처럼 바꿀 수 있습니다.

2. 소멸자

소멸자는 생성자와 달리 쓰레기 컬렉터 (garbage collector)에 의해 객체가 소멸하는 시점을 판단하여 호출됩니다.
여기서 쓰레기 컬렉터, 즉 가비치 컬렉터는 C#에서 효율적인 메모리 관리를 위해 자동으로 더이상 사용하지 않는 객체를 없애줍니다.
(쓰레기 컬렉터에 대해서는 추후 자세하게 다뤄보도록 하겠습니다!!)

소멸자의 사용형태는 이러합니다.

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

클래스 앞에 ~기호를 붙인게 소멸자입니다. 이를 이용해서 예제를 만들어보겠습니다.

[소멸자를 활용한 예제]

using System;

namespace Study
{
	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 객체 소멸!

~MyClass()을 통해 소멸자가 등장했음을 알 수 있습니다. 결과를 보면 a,b,c객체가 만들어지고 소멸합니다.
근데 순서를 보면 생성이 되는 순서대로 없어지지 않습니다. 이는 쓰레기 컬렉터가 언제 어떻게 움직이고
소멸시킬지 모르기 때문에 실행될 때마다 소멸되는 순서가 바뀔 수 있습니다.

이런 소멸자쓰레기 컬렉터가 수거할 수 없는 자원이 있을때 이를 해지하기 위해 사용합니다.
근데 소멸자는 가급적 사용을 하지 않아서 안 쓰는게 좋을 것 같습니다..
객체의 소멸자체는 소멸자 없이도, 쓰레기 컬렉터가 할 수 있기 때문입니다. 비효율적입니다..

마무리하며

오늘은 생성자와 소멸자에 대해서 간단히 알아보았고, 다음에는 클래스의 상속에 대해서 알아보겠습니다!!

Categories:

Updated:

Comments