010-2135-9730무료 상담
개념 풀이

가비지 컬렉션이란? 처음 배우는 사람을 위한 쉬운 설명

가비지 컬렉션(Garbage Collection, GC)은 프로그램이 쓰다가 버린 메모리를 자동으로 찾아 회수해 주는 기능입니다. C#, Java, 자바스크립트 같은 언어에서 기본으로 동작해, 개발자가 메모리를 일일이 해제하지 않아도 됩니다. 편리한 대신 정리하는 순간에 시간이 들어서, 게임에서는 잠깐씩 화면이 멈칫하는 원인이 되기도 합니다. 그래서 게임 프로그래머는 GC를 '없애는' 것이 아니라 '덜 일하게' 만드는 습관을 익힙니다.

읽는 시간 약 7분게임프로그래밍
게임프로그래밍 과정
이 글과 연결된 과정게임프로그래밍 과정 알아보기

최근에는 AI 코딩 도구를 쓰는 개발자가 늘었지만, 생성된 코드가 맞는지 판단하려면 결국 기본기가 필요합니다. 수업에서는 직접 짜는 연습을 충분히 한 뒤 AI…

다 쓴 메모리를 대신 치워 주는 청소부

프로그램은 데이터를 다루기 위해 메모리 공간을 빌려 씁니다. 문자열을 만들거나, 리스트를 새로 만들거나, 적 캐릭터 정보를 담을 객체를 만들 때마다 메모리 한 칸을 차지합니다. 다 쓴 공간을 돌려주지 않으면 메모리는 점점 차고, 결국 프로그램이 느려지거나 멈춥니다.

C나 C++ 같은 언어에서는 개발자가 직접 '이 공간 다 썼어요'라고 반납해야 합니다. 반납을 잊으면 메모리 누수가 생기고, 이미 반납한 공간을 다시 쓰면 프로그램이 망가집니다. 강력하지만 실수하기 쉬운 방식입니다.

가비지 컬렉션이 있는 언어에서는 청소부가 이 일을 대신합니다. 아무도 가리키지 않는, 즉 더 이상 어디서도 쓰이지 않는 데이터를 찾아 쓰레기(가비지)로 보고 치웁니다. 카페에서 손님이 떠난 테이블의 컵을 직원이 알아서 치우는 것과 비슷합니다.

청소하는 동안 게임이 멈칫하는 이유

청소부가 일하려면 어떤 데이터가 아직 쓰이고 어떤 데이터가 버려졌는지 살펴봐야 합니다. 이 확인 작업에는 시간이 듭니다. 방식에 따라 그동안 게임 코드 실행이 잠깐 멈추기도 합니다. 문서 프로그램이라면 눈치채기 어려운 짧은 순간이지만, 1초에 60번 화면을 그려야 하는 게임에서는 한 프레임이 늦어져 '툭' 끊기는 느낌으로 나타납니다.

문제는 이 청소가 언제 일어날지 개발자가 정확히 고르기 어렵다는 점입니다. 쓰레기가 일정량 쌓이면 시작되는 경우가 많아, 쓰레기를 많이 만드는 게임일수록 청소가 자주, 그리고 하필 전투가 격렬한 순간에 일어나기 쉽습니다. 플레이어가 느끼는 '가끔 이유 없이 끊기는 현상'의 흔한 원인입니다.

엔진과 언어 버전에 따라 청소를 여러 프레임에 나눠 하는 방식처럼 멈춤을 줄이는 기술도 쓰입니다. 그래도 쓰레기를 적게 만드는 것이 가장 확실한 대책이라는 점은 같습니다.

게임 코드에서 쓰레기가 생기는 흔한 경우

쓰레기는 대부분 '매 프레임 새로 만드는 것'에서 생깁니다. Unity의 C# 코드를 예로 들면 다음과 같은 습관이 쓰레기를 늘립니다.

  • Update 안에서 문자열을 더해 점수 텍스트를 매 프레임 새로 만들기
  • 매 프레임 새 리스트나 배열을 만들어 주변 적 목록 담기
  • 총알·이펙트를 쏠 때마다 새로 만들고 사라질 때 버리기
  • 결과를 배열로 새로 돌려주는 함수를 반복 호출하기
  • 편리한 데이터 처리 문법을 반복문 안에서 습관적으로 쓰기

하나하나는 작지만 매 프레임 반복되면 1초에 수십 번, 1분에 수천 번 쓰레기가 쌓입니다. 특히 메모리 여유가 적은 모바일 기기에서 차이가 크게 드러납니다.

눈에 잘 띄지 않는 경우도 있습니다. 값을 담는 작은 자료형을 범용 객체로 취급하는 순간 포장 상자가 새로 생기는 박싱(boxing)이 대표적입니다. 코드는 한 줄인데 내부에서는 메모리가 할당되기 때문에, 프로파일러로 확인하기 전에는 원인을 짐작하기 어렵습니다.

가비지를 줄이는 습관

  1. 미리 만들어 재사용하기: 리스트와 배열은 한 번 만들어 두고 내용만 비우고 다시 씁니다.
  2. 자주 생기는 오브젝트는 풀링하기: 총알과 이펙트는 오브젝트 풀에서 빌려 쓰고 돌려줍니다.
  3. 텍스트는 바뀔 때만 갱신하기: 점수가 실제로 바뀐 순간에만 문자열을 새로 만듭니다.
  4. 결과를 담을 그릇을 넘겨주는 함수 쓰기: 많은 엔진 함수가 새 배열 대신 미리 만든 배열에 결과를 채워 주는 버전을 제공합니다.
  5. 로딩 시점에 정리하기: 장면을 바꾸는 로딩 화면처럼 멈춰도 괜찮은 순간에 정리를 몰아서 합니다.

이 습관들은 모두 '같은 그릇을 씻어서 다시 쓰자'는 생각에서 나옵니다. 매번 일회용 컵을 쓰면 쓰레기통이 금방 차지만, 머그컵을 씻어 쓰면 쓰레기 자체가 생기지 않습니다.

처음 배울 때 헷갈리는 점

GC가 있으니 메모리 누수가 절대 생기지 않는다고 생각하기 쉽습니다. 하지만 쓰지 않는 데이터를 어딘가에서 계속 가리키고 있으면 청소부는 그것을 쓰레기로 보지 않습니다. 이벤트 구독을 해제하지 않거나, 큰 목록에 계속 추가만 하고 지우지 않으면 GC가 있어도 메모리는 계속 늘어납니다.

반대로 모든 할당을 두려워할 필요도 없습니다. 게임 시작 때 한 번, 메뉴를 열 때 한 번 만드는 것은 문제가 되지 않습니다. 중요한 것은 매 프레임 반복되는 코드입니다. 감으로 최적화하기보다 엔진의 프로파일러로 어느 함수가 메모리를 많이 할당하는지 확인한 뒤 고치는 것이 바른 순서입니다. Unity 프로파일러에서는 프레임별 GC 할당량을 확인할 수 있습니다.

빠른 상담 신청상담 가능 시간 평일·주말 · 전화 010-2135-9730

직접 측정해 보면 습관이 바뀝니다

간단한 실험으로 시작해 보세요. 매 프레임 문자열을 더해 화면에 표시하는 코드와, 값이 바뀔 때만 갱신하는 코드를 각각 실행하고 프로파일러의 할당량을 비교합니다. 이어서 같은 실험을 저사양 기기나 모바일 빌드에서도 해 보면 차이가 더 분명하게 보입니다. 숫자 차이를 한 번 보고 나면 Update 안에 무엇을 넣을지 자연스럽게 고민하게 됩니다.

게임은 잘 돌아가는데 가끔 이유 모를 끊김이 생긴다면 메모리 관리를 배울 때가 온 것입니다. C#과 엔진 구조를 바탕부터 다지고 싶다면 SBS아카데미게임학원 유니티3D(Unity) 과정 상담에서 최적화가 커리큘럼 어디쯤 들어가는지 확인해 보셔도 좋습니다.

자주 묻는 질문

Unreal Engine에도 가비지 컬렉션이 있나요?

있습니다. C++ 자체에는 GC가 없지만, Unreal Engine은 엔진 객체를 관리하는 자체 GC 시스템을 갖추고 있습니다. 그래서 엔진 규칙에 맞게 객체를 참조해야 합니다.

GC를 꺼 버리면 안 되나요?

일부 환경에서는 특정 구간만 GC를 늦추는 방법이 있지만, 쓰레기 자체가 사라지지는 않아 메모리가 계속 쌓입니다. 근본적으로는 쓰레기를 덜 만드는 것이 해결책입니다.

TIP내 상황에 맞는 답이 필요하다면 무료 상담에서 지금 수준과 목표를 기준으로 구체적으로 안내해 드립니다.

가까운 캠퍼스에서 게임프로그래밍 알아보기

사는 곳과 가까운 캠퍼스를 고르면 수업 내용, 오시는 길, 상담 신청을 한 번에 볼 수 있습니다.

함께 읽으면 좋은 글

Free consulting

게임프로그래밍, 내 상황에서는 어떻게 시작할까요?

글에서 다룬 내용을 내 실력과 목표에 맞춰 담당 멘토가 구체적으로 정리해 드립니다.

  1. 상담 신청서 접수
  2. 담당 멘토가 연락드림
  3. 방문 또는 전화로 진로·과정 상담
전화로 바로 상담010-2135-9730
전화 상담상담 신청