[swift] 참조 카운팅(Reference Counting)

Swift에서는 메모리 관리를 위해 참조 카운팅(Reference Counting)을 사용합니다. 이는 객체가 참조될 때마다 해당 객체의 참조 횟수를 증가시키고, 참조가 해제될 때 해당 횟수를 감소시키는 방식으로 동작합니다.

참조 카운팅의 동작 방식

객체가 생성될 때 참조 횟수는 1로 초기화됩니다. 다른 변수나 상수가 이 객체를 참조할 때마다 해당 객체의 참조 횟수가 증가하고, 참조가 해제될 때마다 감소합니다. 참조 횟수가 0이 되면 해당 객체는 더 이상 필요 없는 것으로 간주되어 메모리에서 해제됩니다.

예를 들어, 다음과 같이 클래스 인스턴스를 생성하고 참조하는 예시를 살펴봅시다.

class Person {
    let name: String

    init(name: String) {
        self.name = name
    }
}

var person1: Person? = Person(name: "Alice")  // 참조 횟수: 1
var person2: Person? = person1                // 참조 횟수: 2
person1 = nil                                 // 참조 횟수: 1
person2 = nil                                 // 참조 횟수: 0 -> 메모리 해제

순환 참조(Strong Reference Cycles) 문제

이러한 참조 카운팅 방식은 순환 참조(Strong Reference Cycles) 문제를 일으킬 수 있습니다. 두 객체 간에 강한 참조 관계가 형성되면, 두 객체가 서로를 해제하지 못해 메모리 누수가 발생할 수 있습니다.

Swift는 이 문제를 해결하기 위해 약한 참조(Weak References)와 비소유 참조(Unowned References)를 제공합니다. 이를 통해 순환 참조를 방지하고 메모리 관리를 개선할 수 있습니다.

참조 카운팅은 Swift의 강력한 메모리 관리 메커니즘 중 하나이며, 올바르게 이해하고 활용하는 것이 중요합니다.

참조 카운팅에 대해 더 알고 싶다면 아래 레퍼런스를 참고하세요.

참고 자료