IOS개발: SWIFT/5. 고급 주제 탐구

Swift ARC (Automatic Reference Counting): 메모리 관리 개념, 강한 참조, 약한 참조

_Blue_Sky_ 2024. 9. 14. 14:14
728x90
728x90

Swift의 ARC(Automatic Reference Counting) 심층 분석: 메모리 관리, 강한 참조, 약한 참조

ARC란 무엇인가요?

ARC는 Automatic Reference Counting의 약자로, Swift에서 메모리를 자동으로 관리하는 시스템입니다. 개발자가 직접 메모리를 할당하고 해제하는 수고를 덜어주어, 메모리 누수 문제를 줄이고 개발 생산성을 높여줍니다.

ARC의 작동 원리

  • 참조 계수: 각 인스턴스는 참조 계수를 가지고 있습니다. 이는 해당 인스턴스를 참조하는 변수의 수를 나타냅니다.
  • 참조 계수 증가: 새로운 변수에 인스턴스를 할당하거나, 프로퍼티에 인스턴스를 저장하면 참조 계수가 1 증가합니다.
  • 참조 계수 감소: 변수가 다른 값으로 할당되거나, 스코프를 벗어나면 참조 계수가 1 감소합니다.
  • 메모리 해제: 참조 계수가 0이 되면 해당 인스턴스는 더 이상 사용되지 않는 것으로 판단되어 메모리에서 해제됩니다.

예시:

class Person {
    let name: String
    init(name: String) {
        self.name = name
    }
}

var person1: Person? = Person(name: "홍길동")
var person2: Person? = person1

// person1과 person2가 모두 person 인스턴스를 참조하므로 참조 계수는 2가 됩니다.
// person1을 nil로 설정하면 참조 계수가 1 감소합니다.
person1 = nil

// person2도 nil로 설정하면 참조 계수가 0이 되고, 인스턴스는 메모리에서 해제됩니다.
person2 = nil
 

강한 참조 (Strong Reference)

  • 기본적인 참조: 변수나 상수에 인스턴스를 할당하면 강한 참조가 형성됩니다.
  • 참조 계수 증가: 강한 참조는 참조 계수를 1 증가시킵니다.
  • 메모리 해제 방지: 강한 참조가 유지되는 동안에는 인스턴스가 메모리에서 해제되지 않습니다.

약한 참조 (Weak Reference)

  • 옵셔널 타입: 약한 참조는 옵셔널 타입(weak var)을 사용하여 선언합니다.
  • 참조 계수에 영향 X: 약한 참조는 인스턴스의 참조 계수에 영향을 미치지 않습니다.
  • 메모리 해제 허용: 인스턴스가 메모리에서 해제되면 약한 참조는 자동으로 nil이 됩니다.

약한 참조 사용 시 주의사항

  • nil 체크: 약한 참조 변수는 언제든지 nil이 될 수 있으므로 항상 nil 체크를 해야 합니다.
  • 순환 참조 방지: 강한 참조 순환을 방지하기 위해 약한 참조를 사용합니다.

예시: 강한 참조 순환 방지

class Person {
    let name: String
    weak var apartment: Apartment?
    init(name: String) {
        self.name = name
    }
}

class Apartment {
    let number: Int
    weak var tenant: Person?
    init(number: Int) {
        self.number = number
    }
}

var person: Person? = Person(name: "홍길동")
var apartment: Apartment? = Apartment(number: 101)

person?.apartment = apartment
apartment?.tenant = person

// person과 apartment가 서로를 강하게 참조하면 메모리 누수가 발생할 수 있습니다.
// weak 키워드를 사용하여 순환 참조를 방지합니다.
 

ARC의 장점

  • 개발자의 메모리 관리 부담 경감: ARC가 메모리 관리를 자동으로 처리해주므로 개발자는 비즈니스 로직에 집중할 수 있습니다.
  • 메모리 누수 방지: ARC는 참조 계수를 통해 메모리 누수를 방지합니다.
  • 안정적인 메모리 관리: ARC는 Swift 컴파일러에 의해 자동으로 처리되므로, 개발자가 직접 메모리 관리를 할 때 발생할 수 있는 오류를 줄일 수 있습니다.

결론

Swift의 ARC는 메모리 관리를 자동화하여 개발 생산성을 높이고 안정적인 앱 개발을 가능하게 합니다. 강한 참조와 약한 참조를 올바르게 이해하고 사용하면 메모리 누수 문제를 예방하고 효율적인 메모리 관리를 할 수 있습니다.

728x90
728x90