TIL

Dart의 Garbage Collector란?

kimw746 2025. 1. 13. 15:21

혹시 컴퓨터의 "메모리"라는 단어 들어본 적 있나요? 메모리는 프로그램이 데이터를 저장하는 일종의 공간입니다.

우리가 Dart 언어로 앱이나 프로그램을 만들 때, Dart는 필요한 데이터를 메모리에 넣어두고 작업을 진행하죠.
그런데 시간이 지나면서 필요 없는 데이터가 쌓인다면? 이걸 정리하지 않으면 메모리가 꽉 차고, 프로그램이 느려지거나 심지어 멈출 수도 있어요!
여기서 등장하는 게 바로 "Garbage Collector(가비지 컬렉터)"입니다. 이름 그대로 가비지(쓰레기)를 자동으로 청소해주는 역할을 합니다. 덕분에 우리가 일일이 메모리를 관리하지 않아도 되고, 더 중요한 코드 작성에 집중할 수 있다고 합니다!


궁금한점, 가비지 컬렉터는 어떤 원리로 작동할까요?

Dart의 가비지 컬렉터는 Generational Garbage Collection(세대별 가비지 컬렉션)이라는 방식을 사용합니다. 이름이 조금 어렵게 들릴 수 있지만, 쉽게 말하면 메모리를 어린 세대(Young Generation)와 노인 세대(Old Generation)로 나눠서 관리하는 방법이에요.

 

  1. Young Generation (젊은 세대)
    프로그램에서 새로 만든 객체들은 처음에 "젊은 세대"에 저장돼요.
    대부분의 객체는 아주 잠깐만 쓰이고 더 이상 필요 없어지는 경우가 많아서, 젊은 세대는 주기적으로 빠르게 청소됩니다.예를 들어, 화면을 스크롤할 때마다 새로 생성되는 리스트나 텍스트 같은 것들이 여기에 해당돼요.
  2. Old Generation (노인 세대)
    젊은 세대에서 살아남은, 즉 계속 사용되는 객체는 "노인 세대"로 이동합니다.
    이 세대는 청소를 덜 자주 하지만, 대신 더 안정적으로 데이터를 보관합니다.

이 방식은 불필요한 데이터를 빠르게 제거하면서도 중요한 데이터를 안전하게 유지할 수 있어요.


Dart의 가비지 컬렉터가 알아서 해주는 일

가비지 컬렉터가 동작하는 과정을 단계별로 살펴볼게요:

  1. 객체 생성
    Dart에서 var text = 'Hello';라고 하면 Dart는 'Hello'라는 데이터를 메모리에 저장합니다.
  2. 객체 사용
    우리가 text 변수를 사용하는 동안 Dart는 메모리에서 이 데이터를 유지합니다.
  3. 객체 필요 없음
    만약 text = null;처럼 더 이상 'Hello'를 참조하지 않으면, Dart는 이 데이터가 필요 없다고 판단합니다.
  4. 가비지 수집
    이제 Dart의 가비지 컬렉터가 나서서 'Hello'를 메모리에서 삭제해줍니다.

이렇게 가비지 컬렉터는 다 해주는데 우리는 어떤것을 조심해야 할까요?

Dart의 가비지 컬렉터는 대부분의 경우 자동으로 동작하니 크게 신경 쓸 필요가 없습니다. 하지만 몇 가지 알아두면 좋은 점이 있어요

  1. 불필요한 객체 생성을 최소화.
    너무 많은 객체를 한꺼번에 만들고 버리면 가비지 컬렉터가 자주 동작해 성능에 영향을 줄 수 있어요. 예를 들어, 무한 루프 안에서 새로운 리스트를 계속 생성하는 코드는 피하는 게 좋아요.
  2. 메모리 누수를 주의.
    가비지 컬렉터는 더 이상 참조되지 않는 객체만 정리합니다. 하지만 우리가 실수로 필요 없는 데이터를 계속 참조하고 있으면 메모리가 해제되지 않을 수 있어요. 예를 들어, 글로벌 변수에 오래된 데이터를 남겨두는 걸 조심해야 해요.
  3. Flutter에서도 동일하게 적용.
    Dart는 Flutter의 기반 언어입니다. 따라서 우리가 Flutter 앱을 개발할 때도 가비지 컬렉터가 뒤에서 메모리를 관리하고 있습니다.

가비지 컬렉터의 장점은?

  1. 개발자의 부담 감소
    메모리를 직접 관리하지 않아도 돼서 코드 작성이 훨씬 편리합니다.
  2. 안정성 향상
    수동으로 메모리를 관리하다 보면 실수로 잘못된 데이터를 삭제하거나 해제하는 경우가 있는데, 가비지 컬렉터는 이런 위험을 줄여줍니다.
  3. 효율적인 메모리 사용
    Dart의 가비지 컬렉터는 세대별 관리 방식을 통해 성능과 메모리 사용 효율을 최적화합니다.