프로그래밍 언어/C#

C# 생성자와 소멸자, 객체 생성과 메모리 관리의 핵심 원리 - C#10

eco7T 2024. 10. 2. 16:01
반응형

이번에는 C# 프로그래밍 언어에서 생성자와 소멸자에 대해 다뤄보고자 합니다. 생성자의 다양한 형태(기본 생성자, 매개변수가 있는 생성자, 복사 생성자)와 소멸자의 개념 및 역할을 정리하고, 객체의 생성과 소멸 과정을 이해하고 이를 코드로 구현할 수 있도록 설명합니다.

C# 생성자와 소멸자
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"); } }
반응형