---
# System prepended metadata

title: 'Q: garbage Collecter랑 차이?'

---

- 메모리의 구조
    - Q. 컴퓨터의 주기억장치는 어떤어떤 영역을 가지고 있을까?
        - 코드영역, 데이터영역, 힙, 스택으로 이루어져 있다.

![](https://i.imgur.com/yEKyyio.png)

메모리는 왜 4가지영역으로 크게 나누어 놓았을까?
프로그램 구현시, 각각의 변수, 함수, 클래스 등이 호출되고 해제되는 시기가 다르기 때문!


또는, 어떠한 함수 내에서 값을 변경하고 함수가 끝나더라도 그 값을 유지했으면 좋겠는데, 만약 함수의 종료와 동시에 그 값이 메모리에서 사라진다면 안되겠죠?
그렇기 때문에 그런 변수들은 Stack메모리에 저장했다가 함수의 호출이 끝나면 내보내는 거죠 :)

- ARC
- Q : ARC는 무엇인가?
    - Swift에서 제공하는 기능으로 참조 카운팅을 통해서 자동으로 메모리를 관리해주는 기능이다.

- Q : ARC 이전의 메모리 관리는 어땠을까?
    - 수동으로 메모리를 할당 해제했을 것 같습니다.

- Q : ARC를 이해해야 하는 이유는 무엇무엇이 있을까?
    - 메모리 누수 관리를 하기 위해서 ARC를 이해해야 합니다.

- Q : 언제 구조체를 선택하고 언제 클래스를 선택해야할까?
    - Use structures by default. 
    - Use classes when you need Objective-C interoperability.
    - Use classes when you need to control the identity of the data you’re modeling.
    - Use structures along with protocols to adopt behavior by sharing implementations.



![](https://i.imgur.com/UuDnE8Y.png)


https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes

## fe
Swift의 클래스는 참조 유형이기 때문에 기본 제공 ID 개념이 있습니다. 이는 두 개의 서로 다른 클래스 인스턴스가 각각의 저장된 속성에 대해 동일한 값을 가질 때 ID 연산자(===)에 의해 여전히 서로 다른 것으로 간주된다는 것을 의미합니다. 또한 앱 전체에서 클래스 인스턴스를 공유할 때 해당 인스턴스에 대한 변경 사항이 해당 인스턴스에 대한 참조를 보유하는 코드의 모든 부분에서 볼 수 있음을 의미합니다. 인스턴스에 이러한 종류의 ID가 필요한 경우 클래스를 사용하십시오. 일반적인 사용 사례는 파일 핸들, 네트워크 연결 및 CBCentralManager와 같은 공유 하드웨어 중개자입니다.
예를 들어 로컬 데이터베이스 연결을 나타내는 유형이 있는 경우 해당 데이터베이스에 대한 액세스를 관리하는 코드는 앱에서 볼 때 데이터베이스 상태를 완전히 제어해야 합니다. 이 경우 클래스를 사용하는 것이 적절하지만 공유 데이터베이스 개체에 액세스할 수 있는 앱 부분을 제한해야 합니다.



reference retain


object-c에서의 메모리 관리는 레퍼런스 카운트 (reference count)를 이용합니다.
모든 객체는 자신을 참조하는 수에 대한 내부 카운터를 가지고 있습니다.


-alloc : 해당 객체에 메모리를 할당하고 레퍼런스 카운트를 1 올립니다.
-retain : 해당 객체의 레퍼런스 카운트를 1 올립니다.
-copy : 해당 객체의 복사본을 만듭니다. 그리고 복사본의 레퍼런스 카운트를 1 올립니다.
-release : 해당 객체의 레퍼런스 카운트를 1 낮춥니다.
-autorelease : 정해지지 않은 시점에 해당 객체의 레퍼런스 카운트가 -1 낮아집니다.

출처: https://sdw8001.tistory.com/102 [훈트이야기:티스토리]
https://developer.apple.com/documentation/objectivec/1418956-nsobject/1571946-retain

# Q: garbage Collecter랑 차이?

ARC is technically a form of garbage collection but a deterministic solution: it is predictable as to when it will happen. The languages such as java and C# use garbage collector which is non-deterministic. That means you can’t tell exactly when objects are being reclaimed because it’s being managed by the runtime by an external process.

The main advantage of ARC is that it’s deterministic behaviour and predictable deconstruction. The objects are deallocated immediately when they are no longer needed.

However, ARC can not deal with reference cycles without developer intervention. On the other hand, the main advantage of garbage collector is that it can detect reference cycles.

ARC는 기술적으로는 가비지 콜렉션의 한 형태.
ARC는 결정적 솔루션. 언제 발생할 지 예측이 가능.
가비지콜렉션은 비결정적 솔루션. 외부 프로세스에 의해 런타임에 의해 관리되기 때문에 언제 발생할 지 알 수 없음.




strong reference cycles(previously known as retain cycles)
