티스토리 뷰

반응형

 

 

 


Deinitialization
소멸자

소멸자(deinitializer)는 클래스 인스턴스가 메모리 해제될 때 즉시 호출되는 함수입니다.
스위프트의 소멸자는 deinit 키워드를 사용해서 사용할 수 있습니다. 그 작성방식은 생성자인 init와 유사합니다. 스위프트 소멸자는 구조체가 아닌 클래스 타입에서만 작성 가능합니다. 

 

 


How Deinitialization Works
소멸자의 작동방식

Swift는 특정 클래스 인스턴스가 더이상 필요없을 때 해당 인스턴스를 자동적으로 메모리 해제합니다. 메모리 공간을 확보하기 위해서 말이죠. Swift는 이러한 메모리 관리를 Automatic Reference Counting(관련 포스팅 링크), 줄여서 ARC라는 방식으로 수행합니다. 전형적으로, 특정 클래스 인스턴스를 메모리 상에서 해제하고 싶을때 수동적으로 해당 인스턴스를 정리할 필요가 없습니다. ARC는 더이상 필요없는 인스턴스에 대해서 자동으로 메모리 할당/해제 코드를 실행해주기 때문입니다. 

하지만, 만약 당신의 앱이 자원을 사용하며 작동되고 있을때, 개인적으로 따로 메모리를 관리해줄 필요가 있을 수 있습니다.
예를들면 만약 당신이 파일을 열기 위한 커스텀 클래스를 만들고, 특정 데이터를 해당 클래스에 작성하고 싶다면, 해당 파일이 닫히고, 관련 클래스가 메모리 해제되기 전에 파일의 데이터를 따로 관리해줘야 할 수 있겠지요. 

클래스(Class)의 소멸자(deinition)은 하나의 클래스 인스턴스 당 최대 하나씩 존재합니다. 소멸자는 별도의 매개변수나 괄호 "()" 등을 명시하지 않습니다. 그 작성 예시는 아래와 같습니다. 

 

 


소멸자(Deinitializer)는 해당 클래스 인스턴스의 메모리 해제가 필요할때 자동적으로 호출됩니다. 더 자세히 말하자면, 인스턴스가 메모리 해제되기 직전에 말이지요.

해당 소멸자를 직접 호출하는것은 허용하지 않습니다. 상위클래스의 소멸자는 그들의 서브클래스에 의해 상속됩니다. 또한 상위클래스 소멸자는 자동적으로 마지막 서브클래스의 소멸자 구현부에서부터 호출이 됩니다. 상위클래스의 소멸자는 항상 호출됩니다. 그 아래의 서브클래스 소멸자에서 구현이 없는 경우에도 말입니다. 

소멸자가 호출되기 전까지 인스턴스는 메모리에서 해제되지 않기 때문에, 소멸자는 호출되는 인스턴스의 모든 프로퍼티를 접근할 수 있습니다. 또한 해당 프로퍼티들에 기반한 행위들을 변형할 수도 있습니다. (예를 들면 닫을 필요가 있는 파일명을 변경하거나...)

 

 


위의 코드를 보면, mungGu는 Person 이라는 클래스의 인스턴스 객체입니다. 생성된 이후에 mungGu 인스턴스에 nil을 할당하는 것은 해당 클래스 인스턴스의 메모리를 해제하는 방식 중 하나입니다. 이렇게 mungGu 클래스 인스턴스에 nil을 할당하면 deinit 소멸자가 호출되며, deinit에 구현해놓은 print()가 호출되며, 콘솔에 문구가 출력되는 것을 볼 수 있습니다. 

 

 


오늘은 Swift의 클래스 인스턴스가 메모리에서 해제될 때 호출되는 소멸자 함수, deinit에 대해서 알아봤습니다.

만약 특정 클래스의 사용이 더이상 필요없어 해제하고 싶은데, deinit이 호출되지 않았다는 것은 순환참조(메모리누수)를 의심해볼 수 있습니다. 이럴 경우, deinit 메서드에 콘솔 출력코드를 두어 메모리 해제여부를 확인해볼 수 있겠습니다.

이런 부분은 아무리 스위프트의 메모리 관리방식인 ARC가 작동된다 하더라도, 코드를 제대로 작성하지 않았다면 메모리 관리 상 사각지대를 만들 수 있으니 신경써야 하는 부분이 되겠습니다. 👨🏻‍💻

모두들 즐거운 하루 되세요! ^-^//

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함