인프런 커뮤니티 질문&답변

Hyobin Kim님의 프로필 이미지
Hyobin Kim

작성한 질문수

유니티(Unity)로 시작하는 게임개발: Part 2. C# 프로그래밍 입문

값타입의 리스트

C#에서의 메모리 관리

작성

·

177

0

계속해서 반복되는 내용에서 깨달은게 있는 것 같은데 맞는지 확인 좀 해주셨으면 합니다

배열에서도, 리스트에서도, 아니 그 이전, 참조에 대해서 배울 때 부터 나오는 점이 어디에 변수와 실제 데이터가 선언이 되느냐의 문제 잖아요?

값형식이라면, 함수 종료시에 바로 바로 스택에서 사라지니까 딱히 메모리 관리라는게 필요 없어 보입니다

참조형식이라면, 실제 데이터가 참조되지 않는다면 Garbage Collector가 알아서 지워주지만, 이걸 잘 이용해야 할 것 같이 보입니다. 참조 변수가 stack에 있다면, 역시나 위의 값형식 처럼(대부분의 경우) 알아서 없어 질거라 기대를 하지만, 멤버 변수로 선언하는 경우처럼 참조 변수 마저도 Heap에 있다면 적절하게 이 참조 변수가 어디서 사라질것인지를 고려해야 할 거라고 생각 합니다

이게 맞나요?

답변 1

0

UDevApp님의 프로필 이미지
UDevApp
지식공유자

안녕하세요. 답변이 늦어 죄송합니다. 요즘 계속 바빠서 답을 늦게 달았습니다.

둘다 맞습니다. 값형식이 스택에 있는 경우 메모리가 사라지므로 관리의 필요가 없습니다. 

참조형식의 경우도 참조가 여러곳에서 이루어 지는 경우 하나만 참조가 해제되어도 가비지컬렉터가 해제하지 않습니다. 

소스코드에서 두 부분에서 참조를 할 경우 하나만 해제되어도 나머지는 사라지지 않습니다. 이걸 저희가 만든 클래스가 이렇게 동작하는데요. 

계층뷰에서의 상황은 조금 다릅니다. (둘다 고려해야 하는 건 맞습니다.)

계층뷰에 게임오브젝트가 있고 리스트에서 이걸 참조 하고 있을때의 이야기입니다.

디스트로이로 게임오브젝트를 파괴해 버리면 실제 오브젝트가 파괴되죠. 그래도 리스트에서는 빈 항목이 남아 있습니다. 그걸 나중에 리스트에서 remove 를 해줘야 나중에 코드에서 오류가 생기지 않겠죠.

일반적인 경우 게임오브젝트의 경우에는 Create 와 Destroy 만 잘 신경쓰면 됩니다. 

둘다 메모리관리를 어떻게 보면 할 필요가 없는데요. 그래도 코드를 작성하다가 보면 오류가 생기는 경우 메모리가 어떻게 동작하는지 모르면 오류를 잡기가 어렵기 때문에 알아야 합니다. 

Hyobin Kim님의 프로필 이미지
Hyobin Kim

작성한 질문수

질문하기