[C#] 생성자와 소멸자란? (Constructor & Destructor)

박현민·2024년 12월 2일

유니티

목록 보기
2/6

객체를 생성하고, 소멸시키는데 사용되는 기능

생성자는 객체가 생성될 때 호출되며 초기화 작업을 수행한다.

반면에 소멸자는 객체가 메모리에서 해제될 때 호출 되어 자원을 정리한다.

생성자란?


  • 클래스가 인스턴스화될 때 호출되는 매서드이다. 객체를 초기화하는데 사용된다.
  • 생성자는 클래스의 이름과 동일한 이름을 가지며, 반환 타입을 지정하지 않는다.
  • 기본 생성자 (매개 변수 X)와 사용자 정의 생성자 (매개 변수 O)를 만들 수 있다.

기본 생성자

using UnityEngine;

public class Player
{
	private string name;
	private int hp;
		
	public Player()
	{
		name = "박현민";
		hp = 100;
	}
}

사용자 정의 생성자

using UnityEngine;

public class Player
{
	private string name;
	private int hp;
		
	public Player(string name, int hp)
	{
		name = this.name;
		hp = this.hp;
	}
}

생성자 메소드 오버로딩

using UnityEngine;

public class Player
{
	private string name;
	private int hp;
		
	public Player()
	{
		name = "박현민";
		hp = 100;
	}
		
	public Player(string name, int hp)
	{
		this.name = name;
		this.hp = hp;
	}
		
	public void PrintInfo()
	{
		Debug.Log($"Name: {name}, Hp: {hp}")
	}
}
using UnityEngine;

public class GameManager : MonoBehaviour
{
	private Player player1;
	private Player player2;
		
	private void Start()
	{
		player1 = new Player();
		player2 = new Player("권재헌", 150);
				
		player1.PrintInfo();
		player2.PrintInfo();
	}
}
// 출력
// Name: 박현민, HP: 100
// Name: 권재헌, HP: 150

소멸자란?


  • 객체가 매모리에서 해제될 때 호출되는 매서드이다. (가비지 컬렉터 (GC)가 실행될 떄)
  • 소멸자는 클래스 이름 앞에 ~를 붙여 정의하며, 반환값이나 매개변수를 받을 수 없다.
using UnityEngine;

public class Player
{
	private string name;
	private int hp;
		
	~Player()
	{
		// 자원 해제 작업 수행!
	}
}

하지만 소멸자는 자주 사용되지 않는다. C#에서는 GC가 대부분의 자원을 자동으로 관리하기 때문에 자원을 직접 해제하는 소멸자는 일반적으로 불필요하다.

게다가, 소멸자가 있는 객체는 GC가 발견하더라도 즉시 제거되지 않고 Finalization Queue라는 대기열에 추가한다. 이 대기열의 객체들은 Finalizer 스레드가 처리한다.

소멸자가 실행된 후에도 객체는 메모리에 남아있어 다음 GC 사이클에서 제거된다.

결과적으로 소멸자가 있는 객체는 최소 두 번의 GC 사이클이 필요하므로 성능 저하를 초래할 수 있다.

profile
자라고 있는 게임개발자

0개의 댓글