[Swift 프로그래밍] 인스턴스 생성 및 소멸

이정훈·2022년 5월 25일
0

Swift 기본

목록 보기
9/22
post-thumbnail

본 내용은 스위프트 프로그래밍 3판 (야곰 지음) 교재를 공부한 내용을 바탕으로 작성 하였습니다.

인스턴스 생성


객체가 메모리에 올라가 할당 되어 있는 상태를 인스턴스라고 할 수 있는데, 인스턴스의 생성을 위해 저장 프로퍼티의 값을 초기화 하는 과정이 이루어진다. 이러한 저장 프로퍼티의 초기화를 구현하기 위한 메서드를 이니셜라이저라고 한다.

이니셜라이저는 메서드 이지만 func 키워드를 사용하지 않고 init라는 키워드를 사용하여 선언하며, 반환값도 존재하지 않는다.

다음은 이니셜라이저를 사용하여 저장 프로퍼티의 값을 초기화해 주는 과정이다.

struct Circle {
    var radius: Double
    
    init(_ radius: Double) {    //이니셜라이저로 프로퍼티 초기화
        self.radius = radius
    }
    
    func area() -> Double {     //원의 넓이 구하는 메서드
        return radius * radius * 3.14
    }
}

let myCircle: Circle = Circle(5)   //반지름 길이 5인 인스턴스 생성
print(myCircle.area())

옵셔널 프로퍼티 타입


인스턴스를 생성 할때, 옵셔널 타입을 제외한 모든 저장 프로퍼티에는 기본값을 할당 하거나 이니셜라이저를 통해 초기화하여 값을 반드시 지정해 주어야 한다.

스위프트에서는 옵셔널 타입이 존재하여 만약 값을 지정해 주기 어려운 경우 프로퍼티를 옵셔널 타입으로 지정해 주면 자동으로 nil 값으로 할당 가능하다.

class Student {
    let studentName: String //상수 프로퍼티
    var studentID: Int?     //옵셔널 프로퍼티
    
    init(studentName: String) {
        self.studentName = studentName
    }
}

let studentLee: Student = Student(studentName: "이철수")
studentLee.studentID = 12345    //옵셔널 프로퍼티 값 할당
print(studentLee.studentName)
print(studentLee.studentID)

위와 같이 studentID의 값을 모를 경우 옵셔널 프로퍼티 타입으로 선언하여 nil 값을 할당해 주었고, 추후에 studentID에 대한 정보를 알게 되었을때 다시 값을 할당 해주는 코드를 구현하였다.

멤버와이즈 이니셜라이저


구조체에서는 사용자 정의 이니셜라이저를 생성하지 않으면 프로퍼티 이름을 매개변수로 가지는 멤버와이즈 이니셜라이저를 제공한다.

struct Point {
    var x: Int = 1
    var y: Int = 1
}

let point1: Point = Point()
let point2: Point = Point(x: 10, y: 20)
let point3: Point = Point(y: 15)    //기본값이 있을 경우 필요한 프로퍼티만 초기화 가능

위의 코드와 같이 매개변수 이름이 프로퍼티 이름과 일치하는 것을 볼 수 있다.

또한 멤버와이즈 이니셜라이저는 구조체만이 구현 가능하기 때문에 클래스에서는 멤버 와이즈 이니셜라이저를 사용 할 수 없다.

초기화 위임 / 실패 가능한 이니셜라이저


인스턴스 생성시 이니셜라이저로 원하지 않는 전달 인자가 들어 올 수 있다. 이렇게 원하지 않는 전달인자를 전달 받았을 때 초기화를 하지 않는 이니셜라이저를 실패 가능한 이니셜라이저라고 한다. 실패 가능한 이니셜라이저는 초기화 실패시 nil 값을 반환하므로 init? 키워드를 사용한다.

enum Customer {
    case Silver, Gold, VIP
    
    init?(point: Int) {
        switch point {
        case 1...49:
            self = .Silver
        case 50...79:
            self = .Gold
        case 80...100:
            self = .VIP
        default:
            return nil
        }
    }
    
    init?(currentPoint: Int, earnPoint: Int) {   //초기화 위임
        self.init(point: currentPoint + earnPoint)
    }
}

var customerLee: Customer? = Customer(point: 77)
print(customerLee)
var customerKim: Customer? = Customer(currentPoint: 75, earnPoint: 6)
print(customerKim)
var customerSon: Customer? = Customer(point: -100)
print(customerSon)

위의 코드는 이니셜라이저로 point 점수를 전달 인자로 받아 point 점수에 해당하는 case를 돌려주는 프로그램이다. 이때 이니셜라이저로 원하지 않는 값이 전달 될 경우 nil을 반환하도록 하였다.
위의 코드에서 사용자 정의 이니셜라이저가 두개 존재 하는데 두번째 위치한 이니셜라이저는 현재 point와 획득한 point 값을 더하여 첫 번째 이니셜라이저로 point 값을 전달해 주어 초기화를 위임하는 이니셜라이저이다.

인스턴스 소멸


스위프트는 인스턴스가 더 이상 필요하지 않으면 메모리에서 해제한다. 만약 인스턴스가 해제되는 시점에 수행해야 할 동작이 있다면 디이니셜라이저를 사용하여 구현 할 수 있다.
디이니셜라이저deinit 키워드를 사용하여 선언히며, 매개변수를 가지지 않고 호출하지 않아도 메모리에서 해제되는 시점에 자동으로 실행된다.

class TestClass {
    deinit {
        print("인스턴스가 메모리에서 해제 됩니다.")
    }
}

var testInstance: TestClass? = TestClass()
testInstance = nil

위의 코드와 같이 testInstance에 nil을 대입하면 testInstance는 더 이상 필요하지 않게 되고 메모리에서 해제 되면서 deinit가 실행된다.

profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글