🔥 객체 해제

338자
5분

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을 통해 할당 해제 시점에 필요한 정리 작업을 수행할 수 있게 해줍니다. 우아하면서도 안전한 방법이라고 할 수 있겠네요!