본문 바로가기
카테고리 없음

[기획 연재 13편] 가비지 컬렉터(GC) vs 수동 관리: 파이썬과 C의 결정적 차이 (자동화의 대가)

by khhjyc_ 2026. 1. 18.

서론: 로봇 청소기와 빗자루의 차이

요즘 나오는 파이썬(Python), 자바(Java), 자바스크립트 같은 언어들은 개발자에게 "메모리 해제(free)"를 강요하지 않습니다. 변수를 마음껏 만들고 버려도, 알아서 청소가 됩니다. 반면 C언어는 하나하나 쫓아다니며 직접 치워야 하죠.

비유하자면 가비지 컬렉터(Garbage Collector, 이하 GC)가 내장된 언어는 '로봇 청소기'가 돌아가는 집이고, C언어는 주인이 직접 '빗자루'를 들고 쓰는 집입니다.

"당연히 로봇 청소기가 편하고 좋은 거 아닌가요?"라고 묻겠지만, NASA의 우주선 제어 시스템이나 초고사양 게임 엔진에서는 로봇 청소기를 끄고 직접 빗자루를 듭니다. 오늘 13편에서는 그 불편함을 선택하는 공학적 이유에 대해 알아봅니다.

본론 1: 가비지 컬렉터, 보이지 않는 집사

GC는 프로그램 뒤편에서 조용히 돌아가는 또 하나의 프로그램입니다. 주기적으로 메모리(힙 영역)를 스캔하면서 "더 이상 쓰이지 않는 변수"를 찾아내 자동으로 삭제합니다.

  • 장점: 개발 속도가 엄청나게 빠릅니다. 메모리 누수(Memory Leak) 걱정 없이 비즈니스 로직에만 집중할 수 있습니다.
  • 단점: 세상에 공짜는 없습니다. GC가 돌아가려면 CPU와 메모리 자원을 추가로 소모해야 합니다.

본론 2: 멈춘 세상 (Stop-the-world)

이것이 GC의 가장 치명적인 문제입니다. 집사가 대청소를 하려면 잠시 가족들에게 "움직이지 말고 비켜주세요"라고 해야 하듯, GC도 메모리를 정리하는 순간 프로그램의 실행을 아주 잠깐 멈춰야 합니다. 이를 Stop-the-world 현상이라고 합니다.

웹사이트 로딩이 0.1초 늦어지는 건 괜찮습니다. 하지만 시속 28,000km로 날아가는 로켓이 궤도 수정 중에 0.1초간 '멈칫'한다면? 혹은 FPS 게임에서 적을 쏘려는 순간 화면이 끊긴다면? 그 결과는 재앙입니다.

이 예측 불가능한 '멈춤 현상' 때문에 실시간성(Real-time)이 중요한 시스템에서는 GC를 기피하고 C언어를 사용합니다.

본론 3: C언어의 수동 관리, 통제의 미학

C언어 개발자가 mallocfree를 직접 쓰는 것은, "내가 원하는 정확한 타이밍에 청소하겠다"는 의지입니다.

  • 예측 가능성: 언제 메모리가 해제될지 개발자가 100% 통제할 수 있습니다. 갑자기 시스템이 멈추는 일이 없습니다.
  • 최대 효율: 청소부가 상주할 필요가 없으니 CPU 자원을 오로지 프로그램 실행에만 쏟을 수 있습니다.

물론 그 대가로 개발자는 12편에서 다룬 '메모리 누수'의 위험을 온전히 떠안아야 합니다. 하지만 극한의 성능을 위해서라면 기꺼이 그 짐을 지는 것이 시스템 엔지니어의 자세입니다.

결론: 무엇을 만들 것인가?

무조건 C언어가 좋다는 것이 아닙니다. 스타트업이 빠르게 웹 서비스를 만들어야 한다면 파이썬이나 자바가 압도적으로 유리합니다. 생산성이 더 중요하니까요.

하지만 하드웨어의 한계를 쥐어짜야 하거나, 1초의 지연도 허용되지 않는 분야라면 수동 관리(C/C++)가 유일한 답입니다. 언어의 우열을 가리는 것이 아니라, 상황에 맞는 도구(Tool)를 선택하는 안목을 기르시길 바랍니다.

다음 [Part 14. 멀티 스레드(Thread): 몸이 하나인 CPU가 동시에 여러 일을 하는 환상] 편에서는, 하나의 CPU가 어떻게 수십 개의 프로그램을 동시에 돌리는지, 그 '동시성'의 마술 같은 원리를 파헤쳐 보겠습니다.