[Swift] ARC 1/3

2025. 1. 28. 18:05·iOS/Swift
728x90
반응형

안녕하세요, iOS 개발하는 루피입니다.

 

오늘은 ARC(Automatic Reference Counting)에 대해 알아보겠습니다. Swift 공식 문서를 바탕으로 ARC의 기본 개념과 강한 참조 사이클이 발생하는 이유까지 공부해 볼 예정입니다.

 

바로 시작하겠습니다!


ARC란?

ARC는 Automatic Reference Counting(자동 참조 카운팅)의 약자로, Swift에서 앱이 사용하는 메모리를 추적하고 관리하기 위한 메커니즘입니다.

Swift에서는 클래스 인스턴스를 생성한 후 별도로 소멸시키지 않아도 됩니다. ARC 덕분에 인스턴스가 더 이상 필요하지 않을 때 메모리를 자동으로 해제해주기 때문입니다.

즉, ARC는 인스턴스가 사용 중인지 아닌지를 추적하고, 더 이상 사용되지 않으면 해당 인스턴스가 차지하던 메모리를 자동으로 반환합니다. 덕분에 개발자는 메모리 관리에 신경 쓰지 않고 코드 작성에 집중할 수 있습니다.


ARC 동작 원리

ARC의 동작을 이해하려면, 참조 카운트가 어떻게 증가하고 감소하는지 확인해야 합니다. 간단한 예제로 살펴보겠습니다.

코드로 확인하기

class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("\\(name) is being initialized")
    }
    deinit {
        print("\\(name) is being deinitialized")
    }
}

var person1: Person?
var person2: Person?
var person3: Person?

이 코드를 실행하면 어떤 출력이 나타날까요? 아무것도 출력되지 않습니다.

왜냐하면 위 코드는 단순히 Person 타입의 변수를 선언했을 뿐, 아직 인스턴스를 생성하지 않았기 때문입니다.

따라서 init() 메서드가 호출되지 않고 아무 출력도 나타나지 않습니다.

참조 증가와 감소

이번에는 인스턴스를 생성하고 참조를 공유하는 예제를 보겠습니다.

person1 = Person(name: "Tom")
person2 = person1
person3 = person1

이 코드를 실행하면 "Tom is being initialized"라는 메시지가 출력됩니다. Person 클래스의 인스턴스를 생성했고, 이를 person1, person2, person3이 공유하고 있기 때문입니다.

 

이제 person1에 nil을 할당해보겠습니다.

person1 = nil

이 경우, 아무 일도 일어나지 않습니다. 왜냐하면 person2와 person3이 여전히 같은 인스턴스를 참조하고 있기 때문입니다. ARC는 참조 카운트가 0이 될 때만 메모리를 해제합니다.

 

모든 참조를 해제해야만 소멸자가 호출됩니다:

person1 = nil
person2 = nil
person3 = nil

이렇게 참조된 모든 변수를 nil로 설정해야 "Tom is being deinitialized" 메시지가 출력됩니다.


강한 참조 사이클 발생 상황

강한 참조 사이클은 두 개 이상의 인스턴스가 서로를 강하게 참조하여, 참조 카운트가 0이 되지 못하는 상황을 말합니다. 이를 코드로 살펴보겠습니다.

순환 참조 예제

class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("\\(name) is being initialized")
    }
    var apartment: Apartment?
    deinit {
        print("\\(name) is being deinitialized")
    }
}

class Apartment {
    let unit: String
    init(unit: String) {
        self.unit = unit
        print("Apartment \\(unit) is being initialized")
    }
    var tenant: Person?
    deinit {
        print("Apartment \\(unit) is being deinitialized")
    }
}

var tom: Person?
var ipark: Apartment?

tom = Person(name: "Tom") // 인스턴스 생성
ipark = Apartment(unit: "1A") // 인스턴스 생성

이 상태에서 순환 참조를 만들어보겠습니다.

tom!.apartment = ipark
ipark!.tenant = tom

이제 tom과 ipark에 nil을 할당해 보겠습니다.

tom = nil
ipark = nil

이 경우, 소멸자가 호출되지 않습니다. Person과 Apartment 인스턴스가 서로를 강하게 참조하고 있어 ARC가 두 객체를 메모리에서 해제하지 못하기 때문입니다.

순환 참조 해결 방법

이때, 순환 참조를 해결하려면, 참조하고 있는 모든 부분을 해제해주어야 합니다.

// 순환 참조 생성
tom!.apartment = ipark
ipark!.tenant = tom

tom?.apartment = nil
ipark?.tenant = nil

tom = nil
ipark = nil

그러면 이렇게 하나하나 ARC 체크하면서 해제를 해주어야 하는데... 너무 번거롭지 않나??

지금은 예제가 간단해서 쉽지 실제 코드를 작성하면 10000줄이 넘어가는 코드를 어떻게 다 확인하고 해제해…..ㅠㅠ

 

네 맞습니다. 아주 번거롭죠 그래서 우리는 다음 시간에 순환 참조를 해결하는 방법을 정리해볼 예정입니다…


오늘도 화이팅입니다!

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] ARC 3/3  (0) 2025.01.30
[Swift] ARC 2/3  (1) 2025.01.28
[Swift] Delegate 패턴을 구현해 사용해 보자  (0) 2025.01.17
[Swift] Delegate를 사용해 객체의 동작을 커스텀하기  (0) 2025.01.16
[Swift] 스위프트에서 KVO 사용하기  (0) 2025.01.16
'iOS/Swift' 카테고리의 다른 글
  • [Swift] ARC 3/3
  • [Swift] ARC 2/3
  • [Swift] Delegate 패턴을 구현해 사용해 보자
  • [Swift] Delegate를 사용해 객체의 동작을 커스텀하기
kimsangjunzzang
kimsangjunzzang
루피 님의 블로그 입니다.
  • kimsangjunzzang
    루피 님의 블로그
    kimsangjunzzang
  • 전체
    오늘
    어제
    • 분류 전체보기 (107) N
      • iOS (63)
        • Swift (34)
        • UIKit (9)
        • SwiftUI (8)
        • RxSwift (12)
      • FE (8)
        • 모던 자바스크립트 (3)
        • HTML (5)
      • Operating System (3) N
      • 트러블 슈팅 (5)
      • 바로 안 나오면 모르는거다 (4)
      • Algorithm (20)
      • 회고록 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    rxswift
    Algorithm
    AppleDeveloperAcademy
    web
    디자인 패턴
    uikit
    CS
    state
    ViewController
    알고리즘
    swift
    HTML
    arc
    프로그래머스
    boj
    SwiftUI
    Concurrency
    ios
    백준
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
kimsangjunzzang
[Swift] ARC 1/3
상단으로

티스토리툴바