유니티에서 Destroy(obj);를 호출하면 즉시 메모리에서 삭제되는 것이 아닙니다. 이 함수는 단순히 "삭제 예정" 태그를 붙이는 역할만 합니다.
메모리에서 실제로 삭제되는 시점은 C#의 Garbage Collector(GC)가 필요 없다고 판단한 이후입니다. 이 때문에 몇 가지 사항만 잘 이해하면 더 안전하고 효율적으로 Destroy()를 사용할 수 있습니다.
Destroy()는 즉시 삭제되지 않는다
Destroy(obj);
Debug.Log(obj); // 여전히 참조 가능 (하지만 삭제 예정)
Destroy()를 호출해도 obj는 즉시 null이 되지 않고, 여전히 리스트에 남아 있을 수도 있습니다.
단지 "삭제 예정(Destroyed)" 태그가 붙을 뿐, 실제 메모리 해제는 나중에 GC가 처리합니다.
같은 오브젝트에 Destroy()를 여러 번 호출해도, 유니티 내부에서 자동으로 무시되므로 문제가 발생하지 않습니다.
Destroy(obj);
Destroy(obj); // 이미 삭제 예정이어도 추가 호출해도 문제 없음
null인 오브젝트에 Destroy()를 호출해도 내부적으로 체크 후 무시되므로 예외가 발생하지 않습니다.
따로 if (obj != null) Destroy(obj); 같은 방어 코드가 필요하지 않습니다.
Destroy(null); // 예외 없이 안전하게 실행됨
한 가지 주의할 점은 Destroy()를 호출해도 obj == null이 true가 아닐 수도 있다는 것입니다.
Destroy(obj);
if (obj == null)
{
Debug.Log("객체가 null이야!"); // 실행되지 않음!
}
유니티는 == null 연산자를 오버라이딩했기 때문에, Destroy()된 오브젝트가 null이 아님에도 false를 반환할 수 있습니다.
Destroy() 와 리스트를 함께 사용할 때
리스트를 순회하면서 Destroy()를 호출해도 전혀 문제가 없습니다.
foreach (var obj in objects)
{
// 외부에서 이미 Destroy(obj) 되었거나,
// null 이거나 모두 안전하게 실행됨
Destroy(obj);
}
objects.Clear(); // 리스트도 깔끔하게 정리
Destroy()는 삭제 예정 상태를 감지해서 자동으로 처리하므로, 걱정 없이 여러 번 호출할 수 있습니다.
리스트에서 제거할 때 Clear();만 호출하면 깔끔하게 해결됩니다.
Destroy() 호출 후 메모리는 언제 해제될까?
즉시 메모리에서 삭제하는 것이 아니라, "삭제 예정" 태그만 붙이는 역할입니다.
실제 메모리 해제는 C#의 GC(Garbage Collector)가 나중에 자동으로 처리합니다.
이미 삭제된 오브젝트에도 Destroy()를 호출해도 문제없습니다.
null 체크만으로 Destroy() 여부를 확인하면 안 됩니다.
리스트에서 정리할 때는 Destroy() 후 Clear();로 마무리하면 됩니다.
이 동작을 이해하면 불필요한 검사를 줄이고 더 깔끔한 코드를 작성할 수 있습니다.
'Unity' 카테고리의 다른 글
Button 클릭시, AddListener() 함수로 연결하는 방법 (0) | 2025.03.25 |
---|---|
Button 클릭 시, 내가 짠 함수를 호출하는 방법 (0) | 2025.03.24 |
유니티 Coroutin 에서 continue 를 쓸 때 주의할 점 (0) | 2025.03.12 |
UIManager를 활용한 효율적인 UI 업데이트 구조 (0) | 2025.03.11 |
FindObjectOfType<T>() 함수 설명 (0) | 2025.03.10 |