본문 바로가기
C#

List<T> 의 동작 방식

by Oz Driver 2025. 3. 16.

C#에서 List<T>는 객체의 메모리를 직접 관리하지 않습니다. 리스트에서 요소를 제거하더라도, 실제 객체의 메모리는 해제되지 않습니다. 이는 C++처럼 delete를 명시적으로 호출하는 방식과 다릅니다.

 

요소 제거와 메모리 관리

List<MyClass> list = new List<MyClass>();
MyClass obj = new MyClass();
list.Add(obj);

list.Remove(obj); // 리스트에서 제거됨

 

위 코드에서 list.Remove(obj); 를 호출하면 리스트에서는 obj 가 제거됩니다. 하지만 obj는 여전히 메모리에 남아 있으며, 다른 곳에서 참조하고 있다면 계속 사용할 수 있습니다.

 

 

GC의 역할

C#의 Garbage Collector(GC)는 더 이상 참조되지 않는 객체를 감지한 후, 적절한 시점에 메모리에서 해제합니다.

list.Remove(obj); // 리스트에서 제거됨

 

객체가 더 이상 참조되지 않을 때 GC가 이를 감지하고 해제합니다. 리스트에서 제거했다고 해서 곧바로 메모리에서 삭제되는 것은 아니며, GC가 '더 이상 이 객체를 참조하는 곳이 없다'고 판단하는 시점에 정리됩니다. 따라서 Remove(obj); 후 null을 설정할 필요는 없습니다. 중요한 것은 리스트에서 제거하는 것만으로 객체의 수명이 끝나는 것이 아니라는 점입니다.

 

 

제거 후에도 남아 있는 객체

리스트에서 요소를 제거하더라도, 객체는 메모리에 그대로 남아 있습니다. 이는 리스트가 직접 메모리를 해제하는 것이 아니라, 단순히 참조만 제거하기 때문입니다. 실제 메모리 해제는 GC(Garbage Collector)가 필요 없다고 판단하는 시점에서 이루어집니다.

List<MyClass> list = new List<MyClass>();
MyClass obj = new MyClass();
list.Add(obj);
list.Remove(obj); // 리스트에서 제거됨

// 하지만 obj는 여전히 메모리에 남아 있을 수 있음

 

 

정리

C#에서는 리스트가 직접 객체를 삭제하지 않으며, 단순히 참조만 제거할 뿐입니다. GC가 적절한 시점에 메모리를 해제하므로, Remove(obj); 후 null을 설정하지 않아도 걱정할 필요가 없습니다.