Initialization
Initialization is the process of preparing an instance of a class, structure, or enumeration for use. This process involves setting an initial value for each stored property on that instance and performing any other setup or initialization that is required before the new instance is ready for use.
Setting Initial Values for Stored Properties
Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.
You can set an initial value for a stored property within an initializer, or by assigning a default property value as part of the propertyโs definition. These actions are described in the following sections.
ํ๋กํผํฐ ์ด๊ธฐ๊ฐ
- ์ค์ํํธ์ ๋ชจ๋ ์ธ์คํด์ค๋ ์ด๊ธฐํ์ ๋์์ ๋ชจ๋ ํ๋กํผํฐ์ ์ ํจํ ๊ฐ์ด ํ ๋น๋์ด ์์ด์ผ ํฉ๋๋ค.
- ํ๋กํผํฐ์ ๋ฏธ๋ฆฌ ๊ธฐ๋ณธ๊ฐ์ ํ ๋นํด๋๋ฉด ์ธ์คํด์ค๊ฐ ์์ฑ๋จ๊ณผ ๋์์ ์ด๊ธฐ๊ฐ์ ์ง๋๊ฒ ๋ฉ๋๋ค.
class PersonA {
// ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ๊ธฐ๋ณธ๊ฐ ํ ๋น
var name: String = "unknown"
var age: Int = 0
var nickName: String = "nick"
}
// ์ธ์คํด์ค ์์ฑ
let jason: PersonA = PersonA()
// ๊ธฐ๋ณธ๊ฐ์ด ์ธ์คํด์ค๊ฐ ์ง๋
์ผ ํ ๊ฐ๊ณผ ๋ง์ง ์๋ค๋ฉด ์์ฑ๋ ์ธ์คํด์ค์ ํ๋กํผํฐ์ ๊ฐ๊ฐ ๊ฐ ํ ๋น
jason.name = "jason"
jason.age = 30
jason.nickName = "j"
์ด๋์ ๋ผ์ด์ (initializer)
- ํ๋กํผํฐ ์ด๊ธฐ๊ฐ์ ์ง์ ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์๋ ์ด๋์ ๋ผ์ด์ init์ ํตํด ์ธ์คํด์ค๊ฐ ๊ฐ์ ธ์ผ ํ ์ด๊ธฐ๊ฐ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
class PersonB {
var name: String
var age: Int
var nickName: String
// ์ด๋์
๋ผ์ด์
init(name: String, age: Int, nickName: String) {
self.name = name
self.age = age
self.nickName = nickName
}
}
let hana: PersonB = PersonB(name: "hana", age: 20, nickName: "ํ๋")
- ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ์ด ๊ผญ ํ์ ์์ ๋๋ ์ต์ ๋์ ์ฌ์ฉ
class PersonC {
var name: String
var age: Int
var nickName: String?
init(name: String, age: Int, nickName: String) {
self.name = name
self.age = age
self.nickName = nickName
}
// ์์ ๋์ผํ ๊ธฐ๋ฅ ์ํ
// convenience init(name: String, age: Int, nickName: String) {
// 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: 15, 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")
//happy.goOut() // ์ฃผ์ธ์ด ์๋ ์ํ๋ผ ์ค๋ฅ ๋ฐ์!!
์คํจ๊ฐ๋ฅํ ์ด๋์ ๋ผ์ด์
- ์ด๋์ ๋ผ์ด์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ์ด๊ธฐ๊ฐ์ด ์๋ชป๋ ๊ฒฝ์ฐ ์ธ์คํด์ค ์์ฑ์ ์คํจํ ์ ์์ต๋๋ค.
- ์ธ์คํด์ค ์์ฑ์ ์คํจํ๋ฉด nil์ ๋ฐํ
- ์คํจ๊ฐ๋ฅํ ์ด๋์ ๋ผ์ด์ ์ ๋ฐํํ์ ์ ์ต์ ๋ ํ์ ์ ๋๋ค.
- init?์ ์ฌ์ฉ
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)
let batman: PersonD? = PersonD(name: "", age: 10)
print(joker) // nil
print(batman) // nil
Deinitialization
A deinitializer is called immediately before a class instance is deallocated. You write deinitializers with the deinit keyword, similar to how initializers are written with the init keyword. Deinitializers are only available on class types.
๋์ด๋์ ๋ผ์ด์ (deinitializer)
- deinit์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ํธ์ถ
- ์ธ์คํด์ค๊ฐ ํด์ ๋๋ ์์ ์ ํด์ผํ ์ผ์ ๊ตฌํํ ์ ์์ต๋๋ค.
- deinit์ ๋งค๊ฐ๋ณ์๋ฅผ ์ง๋ ์ ์์ต๋๋ค.
- ์๋์ผ๋ก ํธ์ถ๋๋ฏ๋ก ์ง์ ํธ์ถํ ์ ์์ต๋๋ค.
- ๋์ด๋์ ๋ผ์ด์ ๋ ํด๋์ค ํ์ ์๋ง ๊ตฌํํ ์ ์์ต๋๋ค.
- ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ARC(Automatic Reference Counting) ์ ๊ท์น์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
class PersonE {
var name: String
var pet: 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 ์ธ์คํด์ค๊ฐ ๋์ด์ ํ์์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ํด์ , deinit ์คํ
// "donald๊ฐ jenny์๊ฒ happy๋ฅผ ์ธ๋ํฉ๋๋ค"
'iOS ๐ > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift15 - Nil-Coalescing Operator (0) | 2021.02.03 |
---|---|
Swift14 - Optional Chaining (0) | 2021.02.03 |
Swift12 - ์์ (0) | 2021.02.02 |
Swift11 - ํ๋กํผํฐ (0) | 2021.02.02 |
Swift10 - first class citizen (0) | 2021.02.02 |