🔥 객체 해제
Swift에서는 인스턴스가 더 이상 필요하지 않을 때 자동으로 할당을 해제하여 리소스를 확보합니다. Swift는 자동 참조 카운팅
(ARC)을 통해 인스턴스의 메모리 관리를 처리하는데요, 이에 대해서는 Automatic Reference Counting에서 자세히 설명하고 있지요.
보통은 인스턴스가 할당 해제될 때 별도의 정리 작업을 수행할 필요가 없습니다만, 여러분이 직접 생성한 리소스를 다룰 때는 추가적인 정리 작업이 필요할 수 있습니다. 예를 들어, 파일을 열고 데이터를 쓰는 커스텀 클래스를 만들었다면, 해당 클래스의 인스턴스가 할당 해제되기 전에 파일을 닫아야 할 것입니다.
deinit 메서드
클래스 정의에는 클래스당 최대 하나의 deinit
메서드를 가질 수 있습니다. deinit
메서드는 매개변수를 받지 않으며, 괄호 없이 작성됩니다.
deinit { // 정리 작업 수행 }
swift
deinit
메서드는 인스턴스 할당 해제가 발생하기 직전에 자동으로 호출됩니다. 여러분이 직접 deinit
메서드를 호출할 수는 없어요. 상위 클래스의 deinit
메서드는 하위 클래스에 의해 상속되며, 하위 클래스의 deinit
구현이 끝난 후 자동으로 호출됩니다. 하위 클래스에서 자체 deinit
을 제공하지 않더라도 상위 클래스의 deinit
은 항상 호출된답니다.
deinit 메서드 내에서의 속성 접근
deinit
메서드가 호출되는 시점에는 아직 인스턴스가 할당 해제되지 않았기 때문에, deinit
내에서는 인스턴스의 모든 속성에 접근할 수 있고, 그 속성에 기반하여 동작을 수정할 수 있습니다. 예를 들면 닫아야 할 파일의 이름을 찾는 것처럼 말이죠.
간단한 예제를 통해 살펴볼까요?
class FileWriter { let fileName: String init(fileName: String) { self.fileName = fileName print("\(fileName) 파일을 열었습니다.") } func writeFile(_ content: String) { print("\(fileName) 파일에 \\"\(content)\\"을 기록합니다.") } deinit { print("\(fileName) 파일을 닫습니다.") } } var fileWriter: FileWriter? = FileWriter(fileName: "example.txt") // "example.txt 파일을 열었습니다." 출력 fileWriter?.writeFile("안녕하세요!") // "example.txt 파일에 "안녕하세요!"을 기록합니다." 출력 fileWriter = nil // "example.txt 파일을 닫습니다." 출력
swift
위 예제에서는 파일 쓰기를 담당하는 FileWriter
클래스를 정의했습니다.
init
에서는 전달받은 파일명을 속성에 저장하고 해당 파일을 열었다는 메시지를 출력하죠.writeFile
메서드에서는 파일에 내용을 기록한다는 메시지를 출력합니다.- 그리고
deinit
에서는fileName
속성에 접근하여 해당 파일을 닫는다는 메시지를 출력하고 있어요.
fileWriter
변수를 nil
로 설정하면 더 이상 FileWriter
인스턴스가 필요없다고 판단하여 할당을 해제하게 되고, 그 직전에 deinit
이 호출되어 파일을 닫는 작업을 수행하게 됩니다.
이렇게 Swift는 ARC를 통해 메모리를 자동으로 관리해주면서도, deinit
을 통해 할당 해제 시점에 필요한 정리 작업을 수행할 수 있게 해줍니다. 우아하면서도 안전한 방법이라고 할 수 있겠네요!