ARC(Automatic Reference Counting)

썹스·2022년 11월 15일
0

Swift 문법

목록 보기
39/68

ARC(Automatic Reference Counting)

Swift의 메모리 관리 방식인 ARC(Automatic Reference Counting)를 배우기 전에 Swift의 데이터 타입 및 관리 방식을 이해해야 합니다.

(데이터 타입에 따른 메모리 할당/관리 방식을 이해해야 ARC를 정확하게 이해할 수 있습니다.)


📌 Swift의 데이터 타입 특징

Swift에서 데이터는 크게 "값 타입"과 "참조 타입"으로 나뉘게 됩니다.

  • 값 타입(Value Type)
    기본 타입(Int, String...), 구조체, 열거형, 컬렉션 등...
    (클래스와 클로저를 제외한 모든 타입을 값 타입이라 생각하는 게 편합니다.)
  • 참조 타입(Reference Type)
    클래스, 클로저

값 타입(Value Type)의 경우에는 작업이 종료됨과 동시에 메모리(스택)에서 데이터가 자동으로 삭제되지만, 참조 타입(Reference Type)의 경우에는 작업이 종료되어도 데이터가 메모리(힙)에 계속 저장되어 있기 때문에 메모리 관리가 필요합니다.

힙(Heap) 영역의 메모리를 관리하지 않을 경우 힙 영역에 메모리 누수(Memory Leak) 현상이 발생할 수 있습니다.

때문에 개발자는 메모리(Heap 영역)공간을 관리해야 하며, Swift는 "ARC" 모델 방식으로 메모리를 관리하고 있습니다.


📌 Swift의 메모리 관리

메모리(Heap 영역)공간의 데이터를 사용되고 있는지 참조의 수를 세는 것이 RC(Reference Counting) 이며, 참조의 수를 자동으로 세주는 것이 ARC (Automatic Reference Counting)입니다.

즉, Swift의 메모리 관리 방식은 메모리(Heap 영역)에 할당된 데이터의 사용(참조) 여부를 카운팅하여 확인하는 방식입니다.

카운팅 결괏값이 0인 경우 메모리(Heap 영역)에서 데이터(참조 타입)를 제거합니다.

번외: MRC(Manual Reference Counting)

MRC는 개발자가 수동적으로 코드를 작성하여 데이터의 사용(참조) 여부를 카운팅 하는 방식입니다.

MRC 방식의 메모리 관리는 Objective-C 언어에서 사용된 방식이며, 현재는 많이 사용되지 않는 방식입니다. (Objective-C 언어는 ARC 방식과 MRC 방식을 모두 사용할 수 있습니다.)

✅ ARC 코드 구현

사실 ARC 방식의 메모리 관리는 컴파일러가 자동으로 구현해주는 방식이기 때문에 별다른 코드 작성이 필요 없습니다.

하지만 컴파일러가 메모리를 자동으로 관리해준다 하더라도 메모리 누수(Memory Leak)가 발생할 수 있기 때문에 유의하여 코드를 작성해야 합니다.

class Man{
    var name: String
    var age: Int
   
    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
   
    deinit{  // 소멸자를 사용하여 참조 카운트 값이 0이 되었을 때 작동
        print("인스턴스(객체)의 참조 카운트 값이 0이 되어 해당 데이터가 메모리(Heap)에서 제거되었습니다.")
    }
}


var kim: Man? = Man(name: "김철수", age: 25)  // 인스턴스 생성과 동시에 해당 데이터를 참조 (참조 카운팅 1 증가)
var lee = kim   // 참조 카운트 1 증가 -> 총 카운트: 2
var park = kim  // 참조 카운트 1 증가 -> 총 카운트: 3

kim = nil   // 참조 카운트 1 감소 -> 총 카운트: 2
lee = nil   // 참조 카운트 1 감소 -> 총 카운트: 1
park = nil  // 참조 카운트 1 감소 -> 총 카운트: 0   소멸자 작동

/*
 출력 결과
 인스턴스(객체)의 참조 카운트 값이 0이 되어 해당 데이터가 메모리(Heap)에서 제거되었습니다.
*/
profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글