이번 시간에는 클래스 인스턴스의 소멸과 그 과정에 대해서 알아보도록 하겠습니다.
클래스 인스턴스의 소멸
Swift 클래스의 인스턴스를 생성하면 해당 속성 및 관련 데이터를 저장하기 위해 메모리를 차지합니다. Swift는 ARC(Automatic Reference Counting)라는 프로세스를 통해 자동 메모리 관리를 사용하여 메모리 사용량을 효율적으로 관리하고 인스턴스가 더 이상 필요하지 않을 때 자동으로 할당을 해제합니다. 이 프로세스는 메모리 누수를 방지하고 애플리케이션의 메모리 사용량을 관리하는 데 도움이 됩니다.
Swift 클래스 인스턴스의 파괴가 작동하는 방식에 대해서 살펴보겠습니다.
- 초기화: 클래스의 새 인스턴스를 생성하면 해당 속성 및 기타 관련 데이터를 저장하기 위해 메모리가 할당됩니다. 인스턴스는 초기 참조 횟수가 1인 것으로 간주됩니다.
- 참조 카운팅: Swift의 ARC는 인스턴스에 대한 참조 수를 추적합니다. 인스턴스를 새 변수에 할당하거나 함수에 인수로 전달하거나 컬렉션(예: 배열)에 저장할 때마다 참조 횟수가 1씩 증가합니다. 인스턴스에 대한 참조가 범위를 벗어나면 또는 참조를 명시적으로 'nil'로 설정하면 참조 횟수가 1씩 감소합니다.
- 제로 참조 카운트: 인스턴스의 참조 카운트가 0에 도달하면 해당 인스턴스를 가리키는 참조가 더 이상 없음을 의미합니다. 이는 인스턴스에 더 이상 액세스할 수 없거나 필요하지 않음을 나타냅니다.
- Deinitialization(Deinit): 인스턴스가 메모리에서 할당 해제되기 전에 Swift는 정리 작업을 수행할 기회를 제공합니다. 이것은 다른 프로그래밍 언어의 소멸자와 유사한 클래스의 deinit 메서드에서 수행됩니다. deinit 메서드에서 리소스를 해제하거나 연결을 닫거나 기타 필요한 정리 작업을 수행할 수 있습니다.
- 할당 해제: deinit 메서드가 호출되고 모든 정리 작업이 완료되면 인스턴스가 할당 해제되고 점유한 메모리가 시스템에서 재사용할 수 있도록 해제됩니다.
Swift의 ARC는 대부분의 메모리 관리 작업을 자동으로 처리하지만 메모리 누수로 이어질 수 있는 잠재적인 유지 주기 또는 강력한 참조 주기를 인식해야 하는 경우가 있습니다.
Swift는 이러한 상황을 해결하고 강력한 참조 순환을 끊기 위해 약한 참조 및 소유되지 않은 참조와 같은 메커니즘을 제공합니다.
요약하면, Swift 클래스 인스턴스의 파괴는 그에 대한 참조를 제거하여 참조 횟수를 0으로 줄이고, 정리 작업을 위해 deinit 메서드를 호출하고, 마지막으로 인스턴스가 점유한 메모리를 할당 해제하는 작업을 포함합니다.
이 자동 메모리 관리 프로세스는 Swift의 메모리 관리를 단순화하고 개발자가 강력하고 효율적인 코드 작성에 집중할 수 있도록 도와줍니다.
보통 deinit 메서드에는 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 넣어줍니다.
위의 코드는 Swift에서 클래스 인스턴스의 생성과 소멸 과정을 보여주는 예제입니다.
class Person {
var height: Float = 0.0
var weight: Float = 0.0
deinit {
print("Person 클래스의 인스턴스가 소멸됩니다.")
}
}
var Purple: Person? = Person()
Purple = nil
Person 클래스 정의
Person 클래스는 height와 weight 라는 두 개의 속성을 가지고 있습니다.
이 클래스에는 deinit 메서드가 정의되어 있는데, 이 메서드는 해당 인스턴스가 소멸될 때 호출됩니다. 소멸 시에 "An instance of the Person class will be destroyed."라는 메시지를 출력합니다.
인스턴스 생성
Person 클래스의 인스턴스를 생성하고 이를 Purple 변수에 할당합니다.
Purple 변수는 옵셔널 타입으로 선언되었기 때문에, 인스턴스를 참조하고 있다가 나중에 nil로 설정하여 참조를 해제할 수 있습니다.
인스턴스 해제
Purple 변수에 nil을 할당함으로써, 이전에 생성한 Person 클래스의 인스턴스에 대한 참조가 제거됩니다.
이로 인해 참조 카운트가 0이 되며, 해당 인스턴스는 더 이상 접근되지 않으므로 메모리에서 해제됩니다.
인스턴스가 소멸될 때 deinit 메서드가 호출되며, "An instance of the Person class will be destroyed." 메시지가 출력됩니다.
요약하면, 위의 코드에서는 Person 클래스의 인스턴스를 생성하고 변수를 통해 참조한 후, 변수에 nil을 할당하여 인스턴스를 해제하는 과정을 보여주고 있습니다.
이 과정에서 인스턴스의 참조 카운트가 증가하고 감소하며, 인스턴스의 deinit 메서드가 소멸 시점에 호출됨을 확인할 수 있습니다.
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
'Apple > Swift' 카테고리의 다른 글
[Swift] 데이터 타입, 상수, 변수의 개념과 예시 (0) | 2023.09.12 |
---|---|
[Swift] for문을 이용한 특정 키워드 반복 출력 (2) | 2023.09.05 |
[Swift] 접근제어 (0) | 2023.08.09 |
[Swift] framework import (0) | 2023.07.26 |
[Swift] 리터럴, 식별자, 키워드 (0) | 2023.07.11 |