C# Practicing(가비지 컬렉션)

2023. 10. 24. 16:44Game Develop/C# Programming

이번 포스트가 C# Practicing의 마지막 포스트가 될 것이다.

마지막으로 알아볼 주제는 가비지 컬렉션이다.

 

가비지 컬렉션 (Garbage Collection) : 여러가지 이유로 생기는 쓰레기를 알아서 치워준다.

- Garbage : 쓰레기.
- 쓸데없이 메모리를 차지하는 데이터, 객체 등을 말함.
- 쓰레기를 치워서 메모리를 절약하지만, 쓰레기를 치우는 일 자체가 힘든 일이다 (컴퓨터의 렉을 유발)

 

가비지 컬렉션은 여러 세대로 나뉜다.

세대별 가비지 컬렉션
- 세대별로 객체를 검사한다. 0 세대, 1 세대, 2세대
- 0 세대에 메모리가 꽉 차면 0 세대를 검사함. 쓰레기가 아닌 객체는 다음 세대로 넘어감.
- 1 세대에 메모리가 꽉 차면 1 세대를 검사함. 쓰레기가 아닌 객체는 다음 세대로 넘어감.
- 2 세대가 꽉 차면 메모리 전체를 검사함 (컴퓨터가 잠시 멈춤)

 

전에 값 형식 VS 참조 형식과, 자료 구조에 대해서 다뤘던 것을 기억하는 가?

 

이러한 쓰레기들은 주로 참조 형식에서 자주 그리고 많이 생긴다.

바로 주소가 바뀌면서 힙 영역의 이전 데이터 주소를 스택 영역의 그 누구도 가르키지 않는 사태가 발생할 수 있다.

그렇다면 이 데이터는 아무도 찾을 수 없고 사용하지도 못하지만 자리만 차지하는 쓰레기가 된다.

이것들을 치워주는게 바로 가비지 컬렉터가 하는 일이다.

 

마지막으로 서로 비슷하지만 반환 값이 결정적으로 차이가 있는 구조체와 클래스를 예로 들고 설명을 마치도록 하겠다.

 

같은 변수를 갖는(이름만 같지 실제로는 다르다) Human 클래스와 Student 구조체를 만들어 줬다.

메인 함수를 이렇게 작성실행해주면 어떻게 될까?

이렇게 출력이 된다. 이것이 클래스와 구조체의 결정적인 차이이다.

 

human은 클래스기 때문에 참조형식이라 human의 name 이 바뀌면 human2의 이름도 같이 바뀌게 된다.

(이 내용은 이미 얕은 복사를 다루면서 했었다), 주소를 공유하는 셈이다. human, human2 모두 동일한 데이터 주소를 가리키게 됨으로 human은 human2와 같다고 볼 수 있다.  이렇게 되면 human2의 주소는 아무도 모르기 때문에 human2의 주소가 가리키는 곳의 데이터는 쓰레기가 된다.

 

반면 student는 구조체이기 때문에 student2 에 student를 넣어주고 student의 이름을 바꿔 주었지만, student2의 이름은 변하지 않았다. 실제 데이터가 있는 주소를 공유하지 않기 때문이다. 

 

위와 같이 클래스끼리 상호작용하는 과정에서 가비지(쓰레기)가 생길 수 있고 이를 찾으러 다니면서 직접 메모리를 해제 하는 시스템을 가비지 컬렉션이라고 한다.

 

이 포스트를 끝으로 C# Practicing 포스팅을 전부 마치도록 하겠다.

'Game Develop > C# Programming' 카테고리의 다른 글

C# Practicing(파일 입출력)  (0) 2023.10.24
C# Practicing(스레드)  (1) 2023.10.24
C# Practicing(C#의 자료구조)  (1) 2023.10.24
C# Practicing(Generic Programming2)  (0) 2023.10.24
C# Practicing(Generic Programming1)  (0) 2023.10.24