반응형
아래 글은 C# 소멸자(Destructor) 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.
📃 참고자료
- C# 교과서(길벗 출판사) - 36단원 소멸자 482 ~ 488페이지
- 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 36. 네임스페이스]
- 닷넷코리아 (https://www.dotnetkorea.com/)
https://www.youtube.com/watch?v=Ls88lTcYVkU
✳ 소멸자(Destructor)
- 생성자와 반대 개념으로 클래스로부터 인스턴스화된 개체가 메모리 상에서 없어질 때 발생하는 메서드
- C#에서는 .NET Framework의 GC(Garbage Collector)가 개체 소멸 시 메모리 해제 등의 역할을 대신해 주기
때문에 직접 접근 할 일은 없음 - 자동차 시동 끄는 기능으로 비유가 가능하며 운전수가 주차하고 시동 끄는 행위를 진행하는 게 아닌
주차요원(GC)이 모든 것을 대신 해주는 것과 의미가 같음
✳ 가비지 수집기(Garbage Collector)
- 자동차(Car) 개체와 관련하여
-> 소멸자: 좋은 호텔 앞에서의 주차요원 열학
=> 왜?
- 키를 받고 알아서 시동을 꺼주니까? - 값 형과 참조형의 할당된 자원 관리 비교
✳ 개체의 라이프 사이클(Object Life Cycle)
- 메모리 할당
- new 키워드 - 개체 초기화
- 생성자(Constructor)에 의한 개체 생성 / 초기화 - 개체 사용
- 속성, 메서드 및 기타 멤버 사용 - 개체 소멸
- 소멸자에 의한 개체 정리 - 메모리 반환
✳ 값 형과 참조형 메모리 자원 관리 비교
- 값 형(Value Type)
- Stack에 저장됨
-> LIFO: 나중에 만들어진 변수부터 먼저 소멸됨
- 해당 범위(Scope)를 벗어나면 자동으로 소멸됨
- 메모리 단편화(memory fragmentation)가 없음 - 참조형(Reference Type)
- Heapp에 저장됨
-> FIFO
- 동일 개체를 여러 번 참조 가능
- 하나라도 참조하고 있으면 소멸되지 않음
-> 메모리 단편화(memory fragmentation)의 원인이 될 수 있음
- 가비지 컬렉터(Garbage Collector)에 의해 관리 됨
✳ 예제코드
// 메서드: 동작/행위 : 자동차의 동작/기능
// 생성자(Constructor) 메서드: 클래스에서 제일 먼저 실행, 자동차 조립/시동걸기
// 소멸자(Desctructor) 메서드: 클래스에서 제일 마지막에 실행, 자동차 폐차/시동끄기
using System;
namespace 생성자_메서드_소멸자
{
public class Car
{
// 필드
private string color;
// 생성자
public Car()
{
color = "검정";
Console.WriteLine("{0}색 자동차를 조립합니다.", color);
}
public Car(string color)
{
this.color = color; // this.필드 = 매개변수;
Console.WriteLine("{0}색 자동차를 조립합니다.", color);
}
// 메서드
public void Go()
{
Console.WriteLine("{0}색 자동차가 달립니다.", color);
}
// 소멸자: GC 엔진 알아서 소멸시킴
~Car()
{
Console.WriteLine("{0}색 자동차를 폐차합니다.", this.color);
}
}
class 생성자_메서드_소멸자
{
static void Main()
{
// Car 클래스의 인스턴스 생성
Car car = new Car(); // 생성
car.Go(); // 호출
// 폐차: 시점을 알 수 없다. GC 엔진이 알아서 실행
// 매개변수가 있는 생성자를 호출
Car whiteCar = new Car("하얀");
whiteCar.Go();
Car blueCar = new Car("파랑");
blueCar.Go();
}
}
}
반응형
'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글
C# 인덱서(Indexer)와 반복기(Iterator) (0) | 2021.06.07 |
---|---|
C# 메서드(Method)와 매개변수(Parameter) (0) | 2021.06.06 |
C# 네임스페이스(Namespace) (0) | 2021.06.04 |
C# 개체(Object) 만들기 (0) | 2021.06.03 |
C# 널(Null) (0) | 2021.06.02 |