ARC

ARC는 무엇일까?

Posted by Neph's Blog on June 27, 2021

ARC의 뜻

Automatic Retain Count의 약자인 ARC는 자동으로 참조카운트를 계산해주는 swift의 기능을 뜻한다.

이름을 통해 유추할 수 있듯 기존에는 자동으로 참조 카운트를 계산하여 메모리로부터 해제해주지 않았기에 프로그래머가 직접 사용을 끝마친 포인터를 메모리에서 해제시켜줘야 했었다.

하지만 ARC를 통해 이제는 참조를 획득하는 과정과 메모리에서 해제하는 과정이 자동으로 이루어진다. (뒷단에서 벌어지는 일이기에 눈에는 보이지 않지만 필요이상의 작업이 이루어지고 있을수도 있다. 이를 방지하기 위해 참조에 대한 이해를 바탕으로 코드를 작성해야 한다.)

Retain Count 왜 필요할까?

포인터는 흔히 주소에 비유한다. 어떤 음식점의 주소를 미리 알고 있던 사람이 음식점에 가기 위해선 음식점의 주소로 이동하면 된다. 근데 만약 음식점이 사라져있다면 곤란할 것이다.

프로그래밍에서도 마찬가지이다 주소값을 통해 접근한 위치에 쓰레기값이 존재하면 언어에 따라 오류를 내는 언어도 있고 쓰레기값을 그대로 가져오는 언어도 있을 것이다. 두 경우 모두 프로그래머의 의도에 벗어난 결과라는 것을 쉽게 알 수 있다.

이런 상황을 방지하기 위해서 Retain Count라는 것이 필요하다. 음식점의 주소를 알고있는 사람이 있다면 그 사람의 수를 세어서 음식점이 보관한다. 만약 음식점의 주소를 알고있는 사람의 수가 0보다 크면 음식점을 계속 유지시키는 개념이다.

힙 영역에 존재하는 값이 필요한 동안에 반드시 사라지지 않는 것을 보장해준다고 생각하면 이해가 쉬울 것 같다.

Retain Cycle은 뭘까?

Retain Count를 통해 “필요한 동안 반드시” 값이 살아있음을 보장받을 수 있단 사실을 알게되었다. 하지만 그 반대의 경우는 어떠할까? “(메모리 공간확보를 위해서) 이제 없어져야 하는” 값이 반드시 적절한 시점에 메모리에서 해제될 것이라는 보장은 하지 못했다. 이런 상황을 메모리 누수가 발생했다 말하며 프로그래머로서 이런 상황을 피해야하는 것이 당연하다.

Retain Cycle을 발생시키는 경우에 대해서 더 자세히 알고싶다면 이 레포지토리를 참고해보면 좋을 것 같다.