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객체가 만들어지고 소멸합니다.
근데 순서를 보면 생성이 되는 순서대로 없어지지 않습니다. 이는 쓰레기 컬렉터가 언제 어떻게 움직이고
소멸시킬지 모르기 때문에 실행될 때마다 소멸되는 순서가 바뀔 수 있습니다.
이런 소멸자는 쓰레기 컬렉터가 수거할 수 없는 자원이 있을때 이를 해지하기 위해 사용합니다.
근데 소멸자는 가급적 사용을 하지 않아서 안 쓰는게 좋을 것 같습니다..
객체의 소멸자체는 소멸자 없이도, 쓰레기 컬렉터가 할 수 있기 때문입니다. 비효율적입니다..
마무리하며
오늘은 생성자와 소멸자에 대해서 간단히 알아보았고, 다음에는 클래스의 상속에 대해서 알아보겠습니다!!
Comments