c나 c++ 언어에서는 동적으로 메모리를 할당할때 명시적으로 할당과 해제가 쌍을
이루어야 합니다.

var = new Human()  <== 메모리 할당
delete var                <== 메모리 해제

 만약 메모리를 할당하고 해제를 하지 않는다면 흔히 말하는 '메모리 릭'이 발생합니다.
메모리를 할당해서 쓰고 해제를 하지 않아 사용되지 않는 메모리가 점차 늘어나면서
어플리케이션은 언젠간 메모리 부족으로 느려지거나 메모리 할당에 실패해서 강제
종료될 수 있습니다. 이런 문제는 프로그래머에게 꽤나 골치 아픈 문제입니다.

 루아에서는 이런 이슈에 대해서 좀더 유연하게 다가갈수 있도록 메모리 추적 시스템을
사용하고 있습니다. 가비지 콜렉션( garbage collection, GC) 이라고 지칭됩니다. 메모리
할당을 해서 사용하되 해제는 루아에서 알아서 해주겠다고 합니다. 메모리 해제를 알아서
해준다구요? 어떻게 그런게 가능할까요? 

1. 지역변수에서 참조할 경우

fuctnion DoSomething
         -- Human 객체를 생성해서 boy라는 지역변수에 할당합니다.
         -- Human 객체를 참조 하고 있는 변수가 boy 하나가 있으므로
         -- Human 인스턴스의 참조 카운트는 1이 됩니다.
         local boy = Human()
 
         -- 메소드를 사용합니다.
         boy:Hello()
end

--DoSomething 메소드가 끝나면 boy이라는 로컬 변수는 삭제되면서 Human의
--참조 카운트를 하나 제거시킵니다. 그럼 Human의 참조 카운트는 0이 되면서
-- 메모리 수거 대상이 됩니다.

2. 멤버 변수에서 참조할 경우

fuctnion DoSomething
          -- Human 객체를 생성해서 boy라는 지역변수에 할당합니다.
          -- Human의 참조 카운트는 1이 됩니다.
         local boy = Human()

        -- 멤버 변수인 girl 이 boy 와 같은 객체를 참조하도록 합니다.
        -- 그럼 Human객체의 참조 카운트는 2가 됩니다... 
        -- self.girl 과 boy 변수 2군데서 참조 하고 있기 때문이죠
        self.girl = boy
       
        -- boy와 girl은 참조하는 객체가 같습니다.
        -- 즉 아래는 같은 결과입니다.
         boy:Hello()
         self.girl:Hello()
end

-- 그럼 DoSomething 함수가 종료 될때 어떤 일이 일어날까요? 지역 변수 boy는 함수의
--종료와 함께 사라질 것입니다. 그러면서 Human 객체의 참조 카운트는 1이 됩니다.
--그러므로 Human 객체는 계속 살아 있게 됩니다. 그러므로 다른 함수에서 self.girl로
--참조 할수 있습니다.

 위의 예와 같이 가비지콜렉션의 장점은 동적으로 할당된 메모리의 해제를 신경 쓰지 않아도
된다는 것입니다. 어떤 곳에서도 참조가 되지 않을때 가비지 콜렉터에 의해 수집되고 해제
되니까요. 하지만 단점은 언제 메모리가 해제 되는지 시점이 명확하지 않고 비사용 메모리를
확인하고 회수하는데 시간이 걸리기 때문에 실시간 어플에는 문제가 될 소지가 있습니다.

가비지 콜렉션의 개념엔 여러가지가 있지만 위에서는 이해를 돕기위한 개념 설명만 간단한
정도이고 더 찾아보시면 여러가지 이해해야 할 내용들이 많습니다.


Posted by great-artist
,