이번에는 C# 프로그래밍 언어에서 생성자와 소멸자에 대해 다뤄보고자 합니다. 생성자의 다양한 형태(기본 생성자, 매개변수가 있는 생성자, 복사 생성자)와 소멸자의 개념 및 역할을 정리하고, 객체의 생성과 소멸 과정을 이해하고 이를 코드로 구현할 수 있도록 설명합니다.
C# 생성자와 소멸자
생성자 (Constructor)
생성자란 객체가 생성될 때 호출되는 특별한 메서드입니다. 이 메서드는 클래스의 인스턴스를 초기화하는 데 사용되며, 객체가 생성될 때 반드시 실행됩니다. 생성자는 클래스 이름과 동일한 이름을 가지고 있으며, 반환형(return type)이 없습니다. 생성자는 기본적으로 객체의 필드 값을 초기화하거나, 필요한 초기 설정 작업을 수행하는 데 활용됩니다.
"객체"는 클래스의 인스턴스를 의미하며, 클래스를 실체화한 것이 바로 객체입니다. 객체를 생성한다는 것은 클래스의 틀을 바탕으로 메모리 공간을 할당하는 작업입니다.
생성자의 종류
생성자는 기본 생성자와 매개변수를 받는 생성자, 복사 생성자 등으로 나눌 수 있습니다.
- 기본 생성자 (Default Constructor): 매개변수가 없는 생성자.
- 매개변수가 있는 생성자 (Parameterized Constructor): 인스턴스를 초기화할 때 외부 값을 전달받아 객체를 생성하는 생성자.
- 복사 생성자 (Copy Constructor): 다른 객체를 복사하여 새로운 객체를 생성하는 생성자.
생성자 코드 예시
아래 예시에서는 C#에서 기본 생성자와 매개변수가 있는 생성자를 어떻게 사용하는지 보여줍니다.
using System;
class Person
{
// 필드 선언
private string name;
private int age;
// 기본 생성자
public Person()
{
name = "이름 없음";
age = 0;
Console.WriteLine("기본 생성자가 호출되었습니다.");
}
// 매개변수가 있는 생성자
public Person(string name, int age)
{
this.name = name;
this.age = age;
Console.WriteLine($"{name}(이)가 {age}살로 생성되었습니다.");
}
// 객체 정보 출력 메서드
public void PrintInfo()
{
Console.WriteLine($"이름: {name}, 나이: {age}");
}
}
class Program
{
static void Main(string[] args)
{
// 기본 생성자를 이용해 객체 생성
Person person1 = new Person();
person1.PrintInfo();
// 매개변수가 있는 생성자를 이용해 객체 생성
Person person2 = new Person("홍길동", 25);
person2.PrintInfo();
}
}
생성자 설명
- 기본 생성자: `Person()`은 매개변수를 받지 않는 생성자입니다. 객체가 생성되면 `name` 필드는 `"이름 없음"`, `age` 필드는 `0`으로 초기화됩니다.
- 매개변수가 있는 생성자: `Person(string name, int age)`는 매개변수로 전달된 `name`과 `age` 값을 받아 객체를 초기화합니다.
- this 키워드: 생성자 내에서 `this`는 해당 객체 자신을 가리킵니다. 따라서 `this.name`은 현재 객체의 `name` 필드를 의미하며, 외부에서 전달된 `name` 값을 필드에 할당하는 작업을 수행합니다.
생성자는 객체가 생성될 때 초기 상태를 설정할 수 있으므로 매우 중요한 역할을 합니다.
소멸자 (Destructor)
소멸자란 객체가 메모리에서 제거될 때 호출되는 메서드입니다. 소멸자는 주로 객체가 더 이상 필요 없을 때 리소스를 정리하고 해제하는 데 사용됩니다. C#에서는 **가비지 컬렉션(Garbage Collection)**이 자동으로 메모리 관리를 하기 때문에 소멸자를 사용하는 경우는 상대적으로 드뭅니다. 그러나 외부 리소스를 사용하는 경우(파일, 네트워크 연결, 데이터베이스 등) 소멸자를 이용해 명시적으로 리소스를 해제할 수 있습니다.
가비지 컬렉션은 메모리에서 더 이상 사용되지 않는 객체를 자동으로 제거하는 시스템입니다. 이 과정에서 객체가 파괴되기 전에 소멸자가 호출됩니다.
소멸자의 특징
- 소멸자는 클래스 이름 앞에 물결표(~)를 붙여 선언합니다.
- 소멸자는 매개변수를 받을 수 없고, 오버로딩(overloading)도 지원하지 않습니다.
- 소멸자는 명시적으로 호출되지 않으며, 객체가 가비지 컬렉션에 의해 제거될 때 자동으로 호출됩니다.
소멸자 코드 예시
using System;
class Resource
{
// 생성자
public Resource()
{
Console.WriteLine("Resource 객체가 생성되었습니다.");
}
// 소멸자
~Resource()
{
Console.WriteLine("Resource 객체가 소멸되었습니다.");
}
}
class Program
{
static void Main(string[] args)
{
// Resource 객체 생성
Resource res = new Resource();
}
}
소멸자 설명
- 소멸자 선언: `~Resource()`는 클래스 이름 앞에 물결표(~)가 붙어 있는 소멸자입니다. 이 소멸자는 `Resource` 객체가 메모리에서 해제될 때 자동으로 호출됩니다.
- 생성자와 소멸자의 차이점: 생성자는 객체가 생성될 때 호출되고, 소멸자는 객체가 파괴될 때 호출됩니다.
- 리소스 관리: C#에서 일반적인 메모리 관리는 가비지 컬렉터가 처리하지만, 파일 핸들, 데이터베이스 연결, 소켓과 같은 외부 리소스를 다룰 때는 소멸자에서 명시적으로 해제할 수 있습니다.
생성자와 소멸자의 상호작용
생성자와 소멸자는 각각 객체의 생애 주기에서 매우 중요한 역할을 담당합니다. 생성자는 객체가 생성될 때 그 객체의 초기 상태를 설정하는 역할을 하며, 소멸자는 객체가 소멸될 때 리소스를 정리하는 역할을 합니다. 이 두 메서드는 객체가 올바르게 동작하고, 메모리나 리소스 누수(leak)를 방지하는 데 중요한 요소입니다.
다음은 생성자와 소멸자가 모두 포함된 클래스의 전형적인 구조입니다.
using System;
class MyClass
{
private string resourceName;
// 생성자
public MyClass(string name)
{
resourceName = name;
Console.WriteLine($"{resourceName} 리소스가 생성되었습니다.");
}
// 소멸자
~MyClass()
{
Console.WriteLine($"{resourceName} 리소스가 소멸되었습니다.");
}
}
class Program
{
static void Main(string[] args)
{
MyClass myObj = new MyClass("TestResource");
}
}
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# 프로그래밍 언어에서 인터페이스와 추상 클래스 차이점 및 사용법 (0) | 2024.10.07 |
---|---|
C# 상속과 다형성, 메서드 오버라이딩과 상속을 통한 다형성 이해 - C#11 (0) | 2024.10.05 |
C# 클래스와 객체 차이점, 필드와 메서드, 생성자 및 상속 예제로 이해하기 - C#9 (0) | 2024.09.30 |
C# 재귀 호출 마스터하기, 팩토리얼과 피보나치 수열 예제로 배우는 프로그래밍 - C#8 (0) | 2024.09.25 |
메서드 오버로딩으로 C# 코드 가독성 향상하기 - C#7 (0) | 2024.09.10 |