본문 바로가기

# 02/Swift

[Swift] 인스턴스의 생성과 소멸

반응형

인스턴스의 생성과 소멸


이니셜라이저와 디이니셜라이저 - init, deinit



- 스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어 있어야 한다.


- 프로퍼티에 미리 기본값을 할당해두면


- 인스턴스가 생성됨과 동시에 초기값을 지니게 된다.






class PersonA {


// 모든 저장 프로퍼티에 기본값 할당 필요!! 안되면 컴파일 에러 뜸

var name: String = "joy"

var age: int = 10

}


let jason: PersonA = PersonA()

jason.name = "jason"

jason.age = 30







// 이니셜라이저

// 프로퍼티 기본값을 지정하기 어려운 경우에는

// 이니셜라이저를 통해

// 인스턴스가 가져야 할 초기값을 전달할 수 있다.


class PersonB {

var name: String

var age: int


// 이니셜라이저

init(name: String, age: Int) {

self.name = name

self.age = age

}

}


let hana: PersonB = PersonB(name: "hana", age: 20)






// 프로퍼티의 초기값이 꼭 필요 없을 때

// 옵셔널을 사용!


class PersonC {

var name: String

var age: int

var nickName: String?



// convenience 안붙이면 컴파일 에러남

convenience init(name: String, age: Int, nickName: String) {

self.init(name: name, age: age)

self.nickName = nickName

}


init(name: String, age: Int) {

self.name = name

self.age = age

}

}



let jenny: PersonC = PersonC(name: "jenny", age: 10)


let mike: PersonC = PersonC(name: "mike", age: 14, nickName: "m")






// 암시적 추출 옵셔널은

// 인스턴스 사용에 꼭 필요하지만

// 초기값을 할당하지 않고자 할 때 사용


class Puppy {

var name: String

var owner: PersonC!


init(name: String) {

self.name = name

}


func goOut() {

print("\(name)가 주인 \(owner.name)와 산책을 합니다")

}

}



let happy: Puppy = Puppy(name: "happy")


// 컴파일 에러남. goOut메서드를 호출하기 위해서는 owner 인스턴스가 존재해야되는데 없으므로 에러 뜸.

happy.goOut()

 

// 에러 안남

happy.owner = jenny

happy.goOut()






// 실패 가능한 이니셜라이저

// 이니셜라이저 매개변수로 전달되는 초기값이 잘못된 경우

// 인스턴스 생성에 실패할 수 있다.

// 인스턴스 생성에 실패하면 nil을 반환한다.

// 그래서 실패가능한 이니셜라이저의 반환타입은 옵셔널 타입이다.


class PersonD {


var name: String

var age: int

var nickName: String?


init?(name: String, age: Int) {

if (0. . .120).contains(age) == false {

return nil

}


if name.characters.count == 0 {

return nil

}


self.name = name

self.age = age

}

}


// 에러남

let john: PersonD = PersonD(name: "john", age: 23)

let john: PersonD? = PersonD(name: "john", age: 23)

let joker: PersonD? = PersonD(name: "joker", age: 123)     // nil - 인스턴스 생성 안함.

let batman: PersonD? = PersonD(name: "", age: 10)    // nil - 인스턴스 생성 안함.








// 디이니셜라이저

// deinit은 클래스의 인스턴스가

// 메모리에서 해제되는 시점에 호출된다.

// 인스턴스가 해제되는 시점에 해야할 일을 구현할 수 있다.


class PersonE {


var name: String

var pat: Puppy?

var child: PersonC


init(name: String, child: PersonC) {

self.name = name

self.child = child

}


deinit {

if let petName = pet?.name {

print("\(name)가 \(child.name)에게 \(petName)를 인도합니다")

self.pet?.owner = child

}

}

}


var donald: PersonE? = PersonE(name: "donald", child: jenny)

donald?.pet = happy


donald = nil    // donald 인스턴스가 더이상 필요없으므로 메모리에서 해제된다.

// donald가 jenny에게 happy를 인도한다.





반응형

'# 02 > Swift' 카테고리의 다른 글

[Swift] 타입캐스팅  (0) 2020.06.04
[Swift] 옵셔널 체이닝과 nil 병합 연산자  (0) 2020.06.04
[Swift] 상속  (0) 2020.06.04
[Swift] 프로퍼티 감시자  (0) 2020.06.04
[Swift] 프로퍼티  (0) 2020.06.04