ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ์ superclass๋ก๋ถํฐ ์์๋ฐ์ ๋ชจ๋ ํ๋กํผํฐ๋ ์ด๊ธฐํ ๋จ๊ณ์์ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ด ํ ๋น๋์ด์ผ ํฉ๋๋ค.
Swift์์๋ ํด๋์ค ํ์
์์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ด๊ธฐ ๊ฐ์ ๊ฐ๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค.
์ง์ ์ด๊ธฐ์์ ํธ๋ฆฌํ ์ด๊ธฐ์
์ง์ ์ด๊ธฐ์๋ primary ์ด๊ธฐ์์ด๋ฉฐ, ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํฉ๋๋ค.
ํด๋์ค ํ์
์ ๋ฐ๋์ ํ ๊ฐ ์ด์์ ์ง์ ์ด๊ธฐ์๊ฐ ์์ด์ผ ํฉ๋๋ค.
ํธ๋ฆฌํ ์ด๊ธฐ์๋ ์ต์ํ์ ์ ๋ ฅ์ผ๋ก ์ด๊ธฐํ๋ฅผ ํ๋ฉฐ, ๋ด๋ถ์์ ๋ฐ๋์ ์ง์ ์ด๊ธฐ์๊ฐ ํธ์ถ๋ผ์ผ ํฉ๋๋ค.
// ์ง์ ์ด๊ธฐ์
init(parameters) {
statements
}
// ํธ๋ฆฌํ ์ด๊ธฐ์
convenience init(parameters) {
statements
}
ํด๋์ค ํ์ ์ ์ํ ์ด๋์ ๋ผ์ด์ ์์
3๊ฐ์ง ๊ท์น
์ ๋ฐ๋ฆ
๋๋ค.
๊ท์น1. ์ง์ ์ด๊ธฐ์๋ ๋ฐ๋์ ์ง๊ณ superclass์ ์ง์ ์ด๊ธฐ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
๊ท์น2. ํธ๋ฆฌํ ์ด๊ธฐ์๋ ๋ฐ๋์ ๊ฐ์ ํด๋์ค์ ๋ค๋ฅธ ์ด๊ธฐ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
๊ท์น3. ํธ๋ฆฌํ ์ด๊ธฐ์๋ ๊ถ๊ทน์ ์ผ๋ก ์ง์ ์ด๊ธฐ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
2๋จ๊ณ ์ด๊ธฐํ (Two-Phase Initialization)
์ฒซ ๋ฒ์งธ ๋จ๊ณ์์๋ ๊ฐ ์ ์ฅ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ์ด๊ธฐํ ํฉ๋๋ค.
๋ชจ๋ ์ ์ฅ๋ ํ๋กํผํฐ์ ์ํ๊ฐ ๊ฒฐ์ ๋๋ฉด, ๋๋ฒ์งธ ๋จ๊ณ๊ฐ ์์๋๋๋ฐ, ์ด ๋จ๊ณ์์ ์ ์ฅ๋ ํ๋กํผํฐ๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํฉ๋๋ค.
Safety Check 4๋จ๊ณ
1. ์ง์ ์ด๊ธฐ์๋ ํด๋์ค ์์ ์ด๊ธฐํ๋ฅผ superclass์ ์ด๊ธฐ์์ ์์ํ๊ธฐ ์ ์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํด์ผ ํฉ๋๋ค.
์์์ ์ธ๊ธํ ๊ฒ ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ ๋ชจ๋ ์ ์ฅ๋ ํ๋กํผํฐ๊ฐ ์ด๊ธฐ ์ํ๋ฅผ ๊ฐ์ด์ผ๋ง ์์ ํ ์ด๊ธฐํ ๋๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์
์ด ๊ท์น์ ๋ง์กฑ์ํค๊ธฐ ์ํด ์ง์ ์ด๊ธฐ์๋ ๋ฐ๋์ ๋ค๋ฅธ ์ด๊ธฐ์๋ก ๋๊ธฐ๊ธฐ ์ ์ ์์ ํ๊ณ ์๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํด์ผ ํฉ๋๋ค.
2. ์ง์ ์ด๊ธฐ์๋ ์์๋ ๊ฐ์ ํ ๋นํ๊ธฐ ์ ์ super class์ ์ด๊ธฐ์๋ก ์์์ ๋๊ฒจ์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์์๋ ๊ฐ์ด superclass ์ด๊ธฐ์์ ๋ฎ์ด ์ฐ์ฌ์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
3. ํธ๋ฆฌํ ์ด๊ธฐ์๋ ์ด๋ค ํ๋กํผํฐ๋ฅผ ํ ๋นํ๊ธฐ ์ ์ ๋ฐ๋์ ๋ค๋ฅธ ์ด๊ธฐ์๋ก ์์์ ๋๊ฒจ์ผ ํฉ๋๋ค.
๋ง์ฝ ๊ทธ๋ ์ง ์์ผ๋ฉด, ํธ๋ฆฌํ ์ด๊ธฐ์์ ์ํด ํ ๋น๋ ๊ฐ์ด ๋ค๋ฅธ ํด๋์ค์ ์ง์ ์ด๊ธฐ์์ ์ํด ๋ฎ์ด ์ฐ์ฌ์ง๊ฒ ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
4. ์ด๋์
๋ผ์ด์ ๋ ์ด๊ธฐํ์ 1๋จ๊ณ๊ฐ ๋๋๊ธฐ ์ ์๋ self์ ๊ฐ์ ์ฐธ์กฐํ๊ฑฐ๋ ์ด๋ค ์ธ์คํด์ค ํ๋กํผํฐ, ๋ฉ์๋ ๋ฑ์ ํธ์ถํ๊ฑฐ๋ ์ฝ์ ์ ์์ต๋๋ค.
์คํจ ๊ฐ๋ฅํ ์ด๊ธฐ์
์ด๊ธฐํ ๊ณผ์ ์ค ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ด๊ธฐ์๋ฅผ init ๋ค์ ๋ฌผ์ํ(?)๋ฅผ ์ฌ์ฉํด ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐ์๋ผ๊ณ ํ์ํ ์ ์์ต๋๋ค.
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty { return nil }
self.species = species
}
}
let anonymousCreature = Animal(species: "")
// anonymousCreature is of type Animal?, not Animal
enum TemperatureUnit {
case kelvin, celsius, fahrenheit
init?(symbol: Character) {
switch symbol {
case "K":
self = .kelvin
case "C":
self = .celsius
case "F":
self = .fahrenheit
default:
return nil
}
}
}
TemperatureUnit(symbol: "X") // ์คํจ
๊ทธ ์ธ์ ์ํผํด๋์ค์ ์คํจ๊ฐ๋ฅํ ์ด๊ธฐ์๋ฅผ ์๋ธํด๋์ค์์ ์คํจ๋ถ๊ฐ๋ฅํ ์ด๊ธฐ์๋ก ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ด์ฉํด ์คํจ๋ถ๊ฐ๋ฅํ ์ด๊ธฐ์๋ฅผ ์์ฑ ๊ฐ๋ฅํฉ๋๋ค. (์๋ธ ํด๋์ค์์ ์์ ํด๋์ค์ ์คํจ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋๋ค.)
init? ์ด๊ธฐ์๋ฅผ init! ์ด๊ธฐ์๋ก ์ค๋ฒ๋ผ์ด๋ฉํ๊ฑฐ๋ ์์ํด์ ์ฌ์ฉํ ์ ์์.
ํ์ ์ด๊ธฐ์
๋ชจ๋ ์๋ธํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ์ด๊ธฐ์์๋ ์๋ ์์ ์ ๊ฐ์ด required ํค์๋๋ฅผ ๋ถ์ฌ ์ค๋๋ค.
ํ์์ด๊ธฐ์๋ฅผ ์์๋ฐ์ ์๋ธํด๋์ค์์๋ ๋ฐ๋์ required ํค์๋๋ฅผ ๋ถ์ฌ์ ๋ค๋ฅธ ์๋ธํด๋์ค์๊ฒ๋ ์ด ์ด๊ธฐ์๋ ํ์ ์ด๊ธฐ์๋ผ๋ ๊ฒ์ ์๋ ค์ผ ํฉ๋๋ค.
class SomeClass {
required init() {
// initializer implementation goes here
}
}
class SomeSubclass: SomeClass {
required init() {
// subclass implementation of the required initializer goes here
}
}
ํด๋ก์ ๋ ํจ์๋ฅผ ์ด์ฉํด ๊ธฐ๋ณธ ํ๋กํผํฐ ๊ฐ์ ์ค์ ํ๊ธฐ
class SomeClass {
let someProperty: SomeType = {
// create a default value for someProperty inside this closure
// someValue must be of the same type as SomeType
return someValue
}()
}
ํด๋ก์ ๋ฅผ ์ด๊ธฐ์์์ ์ฌ์ฉํ๋ฉด ํด๋ก์ ์์ self๋ ๋ค๋ฅธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ํด๋ก์ ๊ฐ ์คํ๋ ์์ ์ ๋ค๋ฅธ ํ๋กํผํฐ๋ ์ด๊ธฐํ๊ฐ ๋ค ๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
'iOS ๐ฅ > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift์์ Abstract Class ๋ง๋ค๊ธฐ (0) | 2023.06.06 |
---|---|
Swift ์๋ฌ ์ฒ๋ฆฌ(Error Handling) (0) | 2021.06.25 |
Codable Protocol์ ์ด์ฉํด์ ๋ณต์กํ JSON Parsing ํ๊ธฐ (0) | 2021.04.15 |
Swift Date์ String ๊ฐ์ ๋ณํ (0) | 2021.04.07 |
Swift Enum๊ณผ Optional (0) | 2021.02.09 |