-
Swift - DeinitializerProgramming/Swift 2021. 12. 19. 11:52
안녕하세요 BeePeach입니다 :)
이번에 공부해볼 내용은 deinitializer입니다. Initializer 이름 앞에 de가 붙었네요??
Init은 초기화를 담당하는 녀석이였습니다.
Deinit은 인스턴스가 메모리에서 해제되기 직전에 호출되는 멤버입니다.
Initializer는 class, struct, enum에서 사용할 수 있지만 deinitializer는 class에서만 사용 가능합니다.
Deinitializer
Swift에서는 인스턴스가 더 이상 사용되지 않는다면 자동적으로 메모리에서 삭제시킵니다.
이러한 방식은 ARC(Automatic Reference Counting)으로 관리가 됩니다. (ARC는 매우 중요하지만 여기서는 다루지 않고 따로 포스팅 하겠습니다.)
메모리 관리를 알아서 하기 때문에 인스턴스가 메모리에서 삭제되는 것을 우리가 직접 관리할 필요가 없습니다.
하지만 인스턴스가 메모리에서 삭제될 때 어떠한 기능을 구현하고 싶다면 deinitializer를 이용하면 됩니다.
문법은 매우 간단합니다. deinit 키워드와 {}를 사용하면 됩니다. init과는 다르게 파라미터 또는 ()가 필요 없습니다.
그리고 우리가 직접 호출할 수 없습니다. 인스턴스가 메모리에서 해제되기 직전에 알아서 호출됩니다.
그렇다는 말은 만약 여러 개의 deinit이 존재한다면 구별이 불가능하겠죠?? 그리고 인스턴스가 메모리에서 해제될 때 호출될뿐이므로 용도를 구분할 필요가 없습니다.
그래서 deinitializer는 class당 한 개만 선언할 수 있습니다.
그럼 한번 아주 간단한 예제를 살펴보겠습니다.
이 예제에서는 Size와 Position을 가지는 Rect class를 생성했습니다.
그리고 deinit 선언하고 Rect 인스턴스가 메모리에서 해제될때 위치를 프린트하도록 구현했습니다.
여기서 알 수 있는 점은 deinit은 인스턴스가 해제되기 직전에 호출이 됩니다.
deinit이 완료가 되어야 비로소 인스턴스가 메모리에서 사라지게 되죠!
그렇기 때문에 deinit block안에서 프로퍼티의 값에 접근할 수 있습니다.
그럼 인스턴스는 어떻게 해야 해제되는 것일까요??
nil을 할당하게 되면 메모리에서 해제되게 됩니다. (사실 무조건 nil이 할당된다고 해제되는 건 아닙니다. 이 과정을 이해하려면 reference counting과 ARC의 개념을 알고 있어야 합니다.)
그렇기 때문에 rect의 타입을 Rect?로 해준 것이죠.
이제 nil을 할당하게 되면 우리가 원하는 결과를 얻을 수 있습니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/Deinitialization.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Protocol (0) 2021.12.22 Swift - Extension (0) 2021.12.20 Swift - Required Initializer (0) 2021.12.18 Swift - Failable InitialIzer (0) 2021.12.17 Swift - Initializer - Inheritance, Overriding (0) 2021.12.11