Skip to content

[iOS 면접질문] ARC에 대하여 #63

@deslog

Description

@deslog

🟣 Swift의 메모리 관리 방법

스위프트는 메모리 관리 방식으로 ARC를 사용한다.

🟣 ARC가 뭔데?

👉 ARC (Automatic Reference Counting, 자동 참조 카운팅)
자동으로 메모리를 관리해주는 방식
'자동'이기 때문에 개발자는 비교적 메모리에 대한 신경을 '덜'쓸 수 있다.
  • 스위프트는 참조타입이라는 것이 존재한다. (Class)
  • 이런 참조타입 객체에 대해서 참조 카운트를 관리하고, 참조 카운트(참조횟수)가 0이 되면 메모리를 자동으로 해제해준다.

🟪 참조타입(Reference type)과 Heap (힙),, 그리고 ARC

💡스위프트는 인스턴스, 클로저  등 참조타입은 자동으로 힙에 할당한다.

⁉️ 힙에 할당하는게 뭔데? 코드를 통해 알아보자.

class Human {
    var name: String?
    var age: Int?

    init(name: String?, age: Int?) {
        self.name = name
        self.age = age
    }
}

let brown = Human(name: "BROWN", age: 17)
  • Human이라는 클래스에 brown이라는 인스턴스를 생성하고, 초기화해줬다.
  • (brown은 전역변수지만, 그냥 class 내부 어딘가에서 생성된 지역변수라고 하자)

이렇게 선언하게되면, 메모리는 아래와 같이 할당된다고 한다.

image

- 지역변수 brown은 스택에 할당
- 실제 Human 인스턴스는 힙에 할당된다.

여기서 빨간화살표가 의미하는 바는, 
스택에 있는 brown이 힙영역의 인스턴스를 참조하고 있는 형태를 가르킨다.
따라서 스택에는 힙에 할당된 그 '주소값'이 들어있다.

아래와 같이 추가로 인스턴스를 만들게 되면?

let brownClone = brown

당연히, 참조타입이기 때문에 복사가 되지 않고, 같은 Human Instance를 가르키는 인스턴스가 되는 것이다.

image

✅ 자 이제 여기서, 힙에 특징이 나온다.

힙의 특징은, 사용하고 난 후에 반드시 메모리를 해제해 주어야 한다는 것이다.

힙에서 메모리를 해제하기 위해서는 release, free등의 방법을 사용해야한다. (뭘까, 나중에 알아보고 일단)

근데 우리는, 이러한 방법을 사용해서 메모리를 해제해준 적이 없을 것이다. 그럼 누가 어떻게 해제해주는 것일까? 스택영역에서 해당 인스턴스가 사라지면, 그냥 메모리 leak 상태로 존재하는걸까?

💡 바로 이것을 자동으로 해제해주는 것이 ARC 이다.

🟪 ARC의 메모리 관리 방법

💡 RC란? (Reference counting)

ARC는 자동(A) 참조 카운팅(RC) 이라고 했다. 진짜 말 그대로, 참조한 횟수(RC)를 카운팅하여, 0이 되면 더이상 사용하지 않는 메모리라고 생각하여 메모리를 해제해 주는 것이다.

따라서 스위프트의 모든 인스턴스는, 전부 RC 를 가지고 있다.

아까의 상황으로 생각해보면, RC는 +2 가 된다.

image

여기서 이제 instance brownnil을 선언해주면, 메모리가 해제된다.

image

객체지향 함수 설명글에서, 스위프트의 대표적인 특징에 대해서 언급했는데, 여기부분에서 질문이 들어왔다. (객체지향과는 관련이없지만!!)

매우매우 중요한 내용이라, PR에서 흘려가듯 리뷰달고싶지 않아서 이렇게 따로 작성해둔다 🫠

📖 Reference

Metadata

Metadata

Assignees

Labels

Interview인터뷰질문 관련Question질문있어요! 이거궁금해요!

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions