시작하기
스위프트 클래스는 인스턴스가 메모리에서 해제되기 직전에 실행되는 `deinit`을 정의할 수 있습니다. 전체 객체 생명 주기인 init → 사용 → deinit을 이해하는 것은 자원 관리의 핵심입니다.
초기화 해제란 무엇인가요?
```swift
class FileHandle {
let path: String
init(path: String) { self.path = path; print("Opened \(path)") }
deinit { print("Closed \(path)") }
}
do {
let f = FileHandle(path: "/tmp/log.txt")
} // deinit called here when f goes out of scope
```
초기화 해제 구문 규칙
• 클래스에서만 사용할 수 있으며 구조체와 열거형에는 `deinit`이 없습니다
• 매개변수나 반환 값이 없습니다
• 괄호를 사용하지 않습니다: `deinit { }`이며 `deinit() { }`가 아닙니다
• ARC가 자동으로 호출하므로 직접 호출하지 않습니다
• 하위 클래스의 `deinit` 다음에 상위 클래스 `deinit`이 자동으로 호출됩니다
정리 사용 사례
`deinit`의 일반적인 사용 사례:
• 네트워크 연결 닫기
• 알림 관찰자 제거: `NotificationCenter.default.removeObserver(self)`
• 타이머 무효화
• 파일 핸들이나 데이터베이스 연결 닫기
참조 수와 생명 주기
ARC는 객체를 가리키는 강한 참조의 수를 추적합니다:
```swift
var a: Dog? = Dog() // retain count = 1
var b = a // retain count = 2
a = nil // retain count = 1
b = nil // retain count = 0 → deinit called
```
하위 클래스 초기화 해제 연쇄
```swift
class Base {
deinit { print("Base deinit") }
}
class Child: Base {
deinit { print("Child deinit") }
// super.deinit called automatically after
}
var c: Child? = Child()
c = nil
// prints: Child deinit, then Base deinit
```
weak로 참조 유지 방지
```swift
class Owner {
var pet: Dog?
deinit { print("Owner gone") }
}
class Dog {
weak var owner: Owner? // weak = no strong retain
deinit { print("Dog gone") }
}
```
`owner`가 nil로 설정되면 Dog가 참조를 보유하고 있더라도 `Owner`를 메모리에서 해제할 수 있습니다.
참조 순환은 초기화 해제를 방지합니다
```swift
class A { var b: B? }
class B { var a: A? }
var a: A? = A()
var b: B? = B()
a?.b = b
b?.a = a
a = nil
b = nil
// deinit never called — retain cycle!
```
타이머 무효화 패턴
```swift
class PollingService {
var timer: Timer?
func start() { timer = Timer.scheduledTimer(...) }
deinit {
timer?.invalidate()
timer = nil
print("Timer stopped")
}
}
```
계측기를 사용한 누수 탐지
`deinit`이 호출되지 않는다면 참조 순환이 있을 가능성이 큽니다. 엑스코드 계측기의 누수 템플릿을 사용하여 할당되었지만 메모리에서 해제되지 않은 객체를 탐지할 수 있습니다.
빠른 확인
어떤 형식이 `deinit`을 정의할 수 있나요?
복습
핵심 내용:
• `deinit { }` — 메모리에서 해제되기 전에 자원을 정리합니다
• 클래스에서만 사용할 수 있으며, 하위 클래스 다음에 상위 클래스 초기화 해제가 자동으로 호출됩니다
• ARC가 초기화 해제 시점을 결정합니다(참조 수가 0으로 감소할 때)
• 참조 순환은 초기화 해제를 방지하므로 `weak`/`unowned`로 끊어야 합니다
• 초기화 해제가 호출되지 않는 객체를 찾으려면 계측기의 누수 도구를 사용합니다
과정을 완료했습니다! 다음 주제: 열거형 패턴과 상태 머신
자주 묻는 질문
“초기화 해제 구문과 메모리 수명 주기” 강의는 무료인가요?
네 — “초기화 해제 구문과 메모리 수명 주기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“초기화 해제 구문과 메모리 수명 주기”에서 뭘 배우나요?
객체가 할당 해제되기 전에 deinit으로 리소스를 정리합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“초기화 해제 구문과 메모리 수명 주기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.