์ด๊ธฐํ๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ค๋น ์์ ์ ํ๋ ๋จ๊ณ ์ด๋ค. ์ด ๋จ๊ณ์์ ๊ฐ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ ๊ฐ์ ์ค์ ํ๋ค. ์ด๊ธฐํ ๊ณผ์ ์ initializer๋ฅผ ์ ์ ํ๋ ๊ฒ์ผ๋ก ๊ตฌํํ ์ ์๋ค. Swift์ initializer๋ ๊ฐ์ ๋ฐํํ์ง ์๋๋ค. ์ด๊ธฐํ์ ๋ฐ๋๋ก ์ฌ๋ฌ ๊ฐ๊ณผ ์์์ ํด์ง๋ฅผ ์ํด deinitializer๋ ์ฌ์ฉํ ์ ์๋ค.
์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ํ ์ด๊ธฐ๊ฐ ์ค์ (Setting Initial Values for Stored Properties)
์ธ์คํด์ค์ ์ ์ฅ ํ๋กํผํฐ๋ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฐ๋์ ํน์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ๋ผ์ผ ํ๋ค. ์ด ๊ฐ์ผ๋ก ๊ธฐ๋ณธ ๊ฐ์ ์ค์ ํ ์ ์๊ณ , ํน์ ๊ฐ์ ์ค์ ํ ์๋ ์๋ค
์ด๋์ ๋ผ์ด์ (Initializers)
์ด๋์ ๋ผ์ด์ ๋ ํน์ ํ์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ์ด๋์ ๋ผ์ด์ ์ ๊ฐ์ฅ ๊ฐ๋จํ ํํ๋ ํ๋ผ๋ฏธํฐ๊ฐ ์๊ณ init ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
init() {
// perform some initialization here
}
struct Fahrenheit {
var temperature: Double
init() {
temperature = 32.0
}
}
var f = Fahrenheit()
print("The default temperature is \(f.temperature)ยฐ Fahrenheit")
// Prints "The default temperature is 32.0ยฐ Fahrenheit"
๊ธฐ๋ณธ ํ๋กํผํฐ
ํ๋กํผํฐ์ ์ ์ธ๊ณผ ๋์์ ๊ฐ์ ํ ๋นํ๋ฉด ๊ทธ ๊ฐ์ ์ด๊ธฐ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
NOTEโ๏ธ
ํญ์ ๊ฐ์ ์ด๊ธฐ ๊ฐ์ ๊ฐ๋ ๋ค๋ฉด ๊ธฐ๋ณธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ํ๋กํผํฐ์ ํ์ ์ ์ ์ธํ์ง ์์๋ ์ปดํ์ผ๋ฌ๋ ์ด๊ธฐ ๊ฐ์ ์ฐธ์กฐํด์ ํ์ ์ ์ถ๋ก ํ ์ ์๋ค. ์ด ๊ธฐ๋ณธ๊ฐ์ ์์์ ํจ๊ป ์์ ๋๋ค.
struct Fahrenheit {
var temperature = 32.0
}
์ปค์คํฐ๋ง์ด์ง ์ด๊ธฐํ (Customizing Initialization
์ด๊ธฐํ ํ๋ก์ธ์ค๋ฅผ ์ ๋ ฅ ๊ฐ๊ณผ ์ต์ ๋ ํ๋กํผํฐ ํ์ ํน์ ์์ ๊ฐ์ ํ ๋นํด์ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ค.
์ด๊ธฐํ ํ๋ผ๋ฏธํฐ (Initialization Parameters)
์ด๊ธฐํ ์ ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํด ์ฌ์ฉํ ์ ์๋ค.
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius is 0.0
ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์ธ์ ๋ ์ด๋ธ (Parameter Names and Argument Labels)
๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ์ด๊ธฐํ ํ๋ผ๋ฏธํฐ ๋ชจ๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์๊ท๋จผํธ ๋ ์ด๋ธ์ ๊ฐ์ง๋ง, ์ด๋์ ๋ผ์ด์ ๋ ํน์ ๋ฉ์๋์์ ์ง์ ํ๋ ๋ฉ์๋ ์ด๋ฆ์ ์ง์ ํ์ง ์๊ณ ์ด๋์ ๋ผ์ด์ ์๋ณ์๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ค. ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ ์๊ท๋จผํธ ๋ ์ด๋ธ์ ๊ฐ๋๋ฐ ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ด ๋ ์ด๋ธ์ ์ง์ ํ์ง ์์ผ๋ฉด Swift๊ฐ ์๋์ผ๋ก ํ๋๋ฅผ ํ ๋นํด ์ ๊ณตํ๋ค.
struct Color {
let red, green, blue: Double
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
init(white: Double) {
red = white
green = white
blue = white
}
}
์ธ์ ๋ ์ด๋ธ์ด ์๋ ์ด๋์ ๋ผ์ด์ ํ๋ผ๋ฏธํฐ (Initializer Parameters Without Argument Labels)
์ฝ๋๋ฅผ ์์ฑํ ๋ ์ธ์ ๋ ์ด๋ธ์ ์๋ตํ๋ ๊ฒ์ด ๋ ๋ช ๋ฃํ ๊ฒฝ์ฐ _ ๊ธฐํธ๋ฅผ ์ฌ์ฉํด ์ด๋์ ๋ผ์ด์ ์์ ์ธ์ ๋ ์ด๋ธ์ ์๋ตํ ์ ์๋ค.
init(_ celsius: Double) {
temperatureInCelsius = celsius
}
์ต์ ๋ ํ๋กํผํฐ ํ์ (Optional Property Types)
ํ๋กํผํฐ์ ์ต์ด ๊ฐ์ด ์๊ณ ๋์ค์ ์ถ๊ฐ๋ ์ ์๋ ๊ฐ์ ์ต์ ๋๋ก ์ ์ธํด ์ฌ์ฉํ ์ ์๋ค. ์ต์ ๋ ํ๋กํผํฐ๋ ์๋์ผ๋ก nil๋ก ์ด๊ธฐํ ๋๋ค.
์ด๊ธฐํ ์ค์ ์์ ํ๋กํผํฐ ํ ๋น (Assigning Constant Properties During Initialization)
์ด๋์ ๋ผ์ด์ ์์๋ ์์ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
NOTEโ๏ธ
ํด๋์ค ์ธ์คํด์ค์์ ์์ ํ๋กํผํฐ๋ ์ด๊ธฐํ ์ค ๊ทธ ํด๋์ค ์์์๋ง ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๊ณ ์๋ธํด๋์ค์์๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.
๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ (Default Initializers)
๋ง์ฝ ๋ชจ๋ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ์ด ์ค์ ๋ผ ์๊ณ , ์ด๋์ ๋ผ์ด์ ๋ ์ ์ํ์ง ์์๋ค๋ฉด Swift๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ๋ ๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ๊ณตํด ์ค๋๋ค.
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
๊ตฌ์กฐ์ฒด ํ์ ์ ์ํ ๋งด๋ฒ์ชฝ ์ด๋์ ๋ผ์ด์ (Memberwise Initializers for Structure Types)
๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ ์ ๋ค๋ฅด๊ฒ ๋งด๋ฒ์ชฝ ์ด๋์ ๋ผ์ด์ ๋ ํ๋กํผํฐ๊ฐ ๊ธฐ๋ณธ ๊ฐ์ด ์์ด๋ ์ปค์คํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ์ํ์ง ์์๋ค๋ฉด ๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ๊ณตํด ์ค๋ค. ์ด ์ด๊ธฐ์๋ ์ ์ธํ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๋ค.
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)
๊ฐ ํ์ ์ ์ํ ์ด๋์ ๋ผ์ด์ ์์ (Initializer Delegation for Value Types)
์ด๋์ ๋ผ์ด์ ์์ ๋ค๋ฅธ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ์ด๋์ ๋ผ์ด์ ์์์ด๋ผ ํ๋ค. ๊ฐ ํ์ (structures, enumerations)๊ณผ ํด๋์ค ํ์ (class)๊ฐ ์ด๋์ ๋ผ์ด์ ์์ ๋์์ด ๋ค๋ฅด๋ค. ๊ฐ ํ์ ์ ์์์ ์ง์ํ์ง ์์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์๊ธฐ ์์ ์ ๋ค๋ฅธ ์ด๋์ ๋ผ์ด์ ์๋ง ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ฉด ํด๋์ค ํ์ ์ ์์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ superclass์ ์ด๋์ ๋ผ์ด์ ๋ฅผ subclass์์ ํธ์ถ ๊ฐ๋ฅํ๋ค. ์์ ๋ฐ์ ๋ชจ๋ ํ๋กํผํฐ์ ์ด๊ธฐํ๋ ์ฑ ์์ ์ด๋์ ๋ผ์ด์ ์ ์๋ค. ์ปค์คํ ์ด๋์ ๋ผ์ด์ ์ ์ธ์ ๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ ํน์ ๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ฐ ์ ์ฝ์ด ์ด๋์ ๋ผ์ด์ ์ ๋ณต์ก์ฑ์ ๋ฎ์ถฐ์ฃผ๊ณ ์ด๋์ ๋ผ์ด์ ๊ฐ ์๋ํ์ง ์๊ฒ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํด ์ค๋ค.
ํด๋์ค ์์๊ณผ ์ด๊ธฐํ (Class Inheritance and Initialization)
๋ชจ๋ ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ์ superclass๋ก๋ถํฐ ์์๋ฐ์ ๋ชจ๋ ํ๋กํผํฐ๋ ์ด๊ธฐํ ๋จ๊ณ์์ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ด ํ ๋น๋ผ์ผ ํ๋ค. Swift์์๋ ํด๋์ค ํ์ ์์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ด๊ธฐ ๊ฐ์ ๊ฐ๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ๋ค.
์ง์ ์์ฑ์์ ํธ์ ์์ฑ์ ๋ฌธ๋ฒ (Syntax for Designated and Convenience Initializers)
ํด๋์ค์ ์ง์ ์ด๊ธฐ์์ ๋ฌธ๋ฒ์ ๊ฐ ํ์ ์ด๊ธฐ์์ ๊ฐ๋ค.
init(parameters) {
statements
}
ํธ์ ์์ฑ์๋ ๊ธฐ๋ณธ ์์ฑ์์ ๋ฌธ๋ฒ์ด ๊ฐ์ง๋ง init ์์ convenience ํค์๋๋ฅผ ๋ถ์ฌ ์ค๋ค.
convenience init(parameters) {
statements
}
ํด๋์ค ํ์ ์ ์ํ ์ด๋์ ๋ผ์ด์ ์์ (Initializer Delegation for Class Types)
์ง์ ์ด๊ธฐ์์ ํธ๋ฆฌํ ์ด๊ธฐ์ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋จ์ํ๊ฒ ํ๊ธฐ ์ํด Swift๋ ์ด๋์ ๋ผ์ด์ ๋ ์์ํ๋ ํธ์ถ์ ์ํด ๋ค์ 3๊ฐ์ง ๊ท์น์ ๋ฐ๋ฅธ๋ค.
- ๊ท์น 1 ์ง์ ์ด๊ธฐ์๋ ๋ฐ๋์ ์ง๊ณ superclass์ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
- ๊ท์น 2 ํธ์ ์์ฑ์๋ ๋ฐ๋์ ๊ฐ์ ํด๋์ค์ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
- ๊ท์น 3 ํธ์ ์์ฑ์๋ ๊ถ๊ทน์ ์ผ๋ก ์ง์ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
๊ธฐ์ตํ๊ธฐ ์ฝ๊ฒ ์์ฝํ์๋ฉด
- ์ง์ ์ด๊ธฐ์๋ ๋ฐ๋์ ์์์ superclass๋ก ํด์ผํ๊ณ
- ํธ๋ฆฌํ ์ด๊ธฐ์๋ ๋ฐ๋์ ์์์ ๊ฐ์ ๋ ๋ฒจ์์ ํด์ผํ๋ค.
๊ทธ๋ฆผ์ ๋ณด๋ฉด Subclass์ ํธ๋ฆฌํ ์ด๊ธฐ์๋ ๊ฐ์ ๋ ๋ฒจ์์ ๋ค๋ฅธ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํ๊ณ ์ง์ ์์ฑ์๋ ์ด๊ธฐํ๋ฅผ ์์ ํด๋์ค์๊ฒ ์์ํด ์์ ํด๋์ค์ ์ง์ ์์ฑ์๊ฐ ํธ์ถ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
NOTEโ๏ธ
์์ฑ์ ํธ์ถ์ ํํ๊ฐ ๋ฐ๋์ ์ ์ฒ๋ผ ๋์ผ ํ๋ ๊ฒ์ ์๋๋ค. ์์์ ์ธ๊ธ๋ง ๊ท์น๋ง ์ง์ผ์ง๋ฉด ์๊ด ์๋ค.
2๋จ๊ณ ์ด๊ธฐํ (Two-Phase Initialization)
Swift์์ ํด๋์ค ์ด๊ธฐํ๋ 2๋จ๊ณ๋ก ์งํ๋๋ค. ์ฒซ๋ฒ์งธ ๋จ๊ณ์์๋ ๊ฐ ์ ์ฅ๋ ํ๋กํผํฐ๋ ์ด๊ธฐ๊ฐ์ผ๋ก ์ด๊ธฐํ ๋๋ค. ๋ชจ๋ ์ ์ฅ๋ ํ๋กํผํฐ์ ์ํ๊ฐ ๊ฒฐ์ ๋๋ฉด ๋๋ฒ์งธ ๋จ๊ณ๊ฐ ์์๋๋ค. ๋๋ฒ์งธ ๋จ๊ณ์์๋ ์๋ก์ด ์ธ์คํด์ค์ ์ฌ์ฉ์ด ์ค๋น๋๋ค๊ณ ์๋ ค์ฃผ๊ธฐ ์ ์ ์ ์ฅ๋ ํ๋กํผํฐ๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๋ ๋จ๊ณ์ด๋ค.
Swift์ ์ปดํ์ผ๋ฌ๋ 2๋จ๊ณ ์ด๊ธฐํ๊ฐ ์๋ฌ์์ด ๋๋๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด 4๋จ๊ณ ์์ ํ์ธ(safety-check)์ ํ๋ค.
- ์์ ํ์ธ 1๋จ๊ณ ์ง์ ์์ฑ์๋ ํด๋์ค ์์์ ์ด๊ธฐํ๋ฅผ superclass์ ์์ฑ์์๊ฒ ์์ํ๊ธฐ ์ ์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํด์ผํ๋ค. ์์์ ์ธ๊ธํ ๊ฒ ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ ๋ชจ๋ ์ ์ฅ๋ ํ๋กํผํฐ๊ฐ ์ด๊ธฐ ์ํ๋ฅผ ๊ฐ์ด์ผ๋ง ์์ ํ ์ด๊ธฐํ ๋๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์ ์ด ๊ท์น์ ๋ง์กฑ์ํค๊ธฐ ์ํด ์ง์ ์์ฑ์๋ ๋ฐ๋์ ๋ค๋ฅธ ์์ฑ์๋ก ๋๊ธฐ๊ธฐ ์ ์ ์์ ํ๊ณ ์๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํด์ผ ํ๋ค.
- ์์ ํ์ธ 2๋จ๊ณ ์ง์ ์์ฑ์๋ ๋ฐ๋์ ์์๋ ๊ฐ์ ํ ๋นํ๊ธฐ ์ ์ superclass์ ์์ฑ์๋ก ์์์ ๋๊ฒจ์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์๋ ๊ฐ์ด superclass์ด ์์ฑ์์ ์ํด ๋ฎ์ด ์ฐ์ฌ์ง๊ฒ ๋๋ค.
- ์์ ํ์ธ 3๋จ๊ณ ํธ์ ์์ฑ์๋ ๋ฐ๋์ ์ด๋ค ํ๋กํผํฐ๋ฅผ ํ ๋นํ๊ธฐ ์ ์ ๋ค๋ฅธ ์์ฑ์๋ก ์์์ ๋๊ฒจ์ผ ํ๋ค. ๋ง์ฝ ๊ทธ๋ ์ง ์์ผ๋ฉด ํธ์ ์์ฑ์์ ์ํด ํ ๋น๋ ๊ฐ์ ๋ค๋ฅธ ํด๋์ค์ ์ง์ ์์ฑ์์ ์ํด ๋ฎ์ด ์ฐ์ฌ์ง๊ฒ ๋๋ค.
- ์์ ํ์ธ 4๋จ๊ณ ์ด๋์ ๋ผ์ด์ ๋ ์ด๊ธฐํ์ 1๋จ๊ณ๊ฐ ๋๋๊ธฐ ์ ์๋ self์ ๊ฐ์ ์ฐธ์กฐํ๊ฑฐ๋ ์ด๋ค ์ธ์คํด์ค ํ๋กํผํฐ, ๋ฉ์๋ ๋ฑ์ ํธ์ถํ๊ฑฐ๋ ์ฝ์ ์ ์๋ค.
์ด๋์ ๋ผ์ด์ ์ ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ (Initializer Inheritance and Overriding)
Swift์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก subclass์์ superclass์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์์ํ์ง ์๋๋ค. ์ด์ ๋ superclass์ ์ด๋์ ๋ผ์ด์ ๊ฐ ๋ฌด๋ถ๋ณํ๊ฒ ์์๋ผ ๋ณต์กํ๊ฒ ๋ผ subclass์์ ์ด๊ฒ๋ค์ด ์๋ชป ์ด๊ธฐํ ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํจ์ด๋ค.
๋ง์ฝ ํด๋์ค์์ ๋ชจ๋ ํ๋กํผํฐ์ ์ด๊ธฐ ๊ฐ์ด ์ง์ ๋ผ ์๊ณ ์๋ฌด๋ฐ ์ปค์คํ ์ด๊ธฐ์๋ฅผ ์ ์ธํ์ง ์์๋ค๋ฉด ๊ธฐ๋ณธ ์ด๊ธฐ์ init()์ ์ฌ์ฉํ ์ ์๋ค.superclass์ ์ด๊ธฐ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๊ธฐ ์ํด์๋ subclass์์ ๊ทธ ์ด๊ธฐ์์ override ํค์๋๋ฅผ ๋ถ์ด๊ณ ์ฌ์ ์ ํ๋ค.
class Vehicle {
var numberOfWheels = 0
var description: String {
return "\(numberOfWheels) wheel(s)"
}
}
let vehicle = Vehicle()
print("Vehicle: \(vehicle.description)")
// Vehicle: 0 wheel(s)
class Bicycle: Vehicle {
override init() {
super.init()
numberOfWheels = 2
}
}
let bicycle = Bicycle()
print("Bicycle: \(bicycle.description)")
// Bicycle: 2 wheel(s)
์๋ ์์ฑ์ ์ธ์คํด์ค (Automatic Initializer Inheritance)
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]")
}
}
ํธ์ ์์ฑ์ convenience init()์์ ์ง์ ์์ฑ์ init(name: String)์ด ํธ์ถ๋๋ ํํ์ด๋ค.
Food ํด๋์ค๋ ๋ชจ๋ ํ๋กํผํฐ์ ๊ธฐ๋ณธ๊ฐ์ด ์๋๊ฒ ์๋๋ฏ๋ก ๋งด๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ ๋ฅผ ๊ฐ์ง๋ ์๋๋ค.
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
์ํผํด๋์ค์ init(name: name) ์์ฑ์๋ฅผ ์์๋ฐ์ ์ง์ ์์ฑ์๋ฅผ ์์ฑํ๊ณ ๊ทธ ์ง์ ์์ฑ์๋ฅผ ํธ์ ์์ฑ์ convenience init(name: String)์์ ์ค๋ฒ๋ผ์ด๋ฉํด ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ์์ฑํ RecipeIngredient ํด๋์ค๋ ๋ค์ 3๊ฐ์ง ํํ์ ์ด๊ธฐ์๋ฅผ ์ด์ฉํด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
let oneMysteryItem = RecipeIngredient()
let oneBacon = RecipeIngredient(name: "Bacon")
let sixEggs = RecipeIngredient(name: "Eggs", quantity: 6)
ShoppingListItem๋ purchased๋ผ๋ bool ํ๋กํผํฐ์ description์ด๋ผ๋ ๊ณ์ฐ๋ ํ๋กํผํฐ 2๊ฐ์ง๋ฅผ ์๋ก ์์ฑํ๋ค.
class ShoppingListItem: RecipeIngredient {
var purchased = false
var description: String {
var output = "\(quantity) x \(name)"
output += purchased ? " โ" : " โ"
return output
}
}
์ด์ ์ด ๋ชจ๋ 3๊ฐ์ ์ด๊ธฐ์๋ฅผ ์ด์ฉํด ShoppingListItem ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
var breakfastList = [
ShoppingListItem(),
ShoppingListItem(name: "Bacon"),
ShoppingListItem(name: "Eggs", quantity: 6),
]
breakfastList[0].name = "Orange juice"
breakfastList[0].purchased = true
for item in breakfastList {
print(item.description)
}
// 1 x Orange juice โ
// 1 x Bacon โ
// 6 x Eggs โ
์คํจ ๊ฐ๋ฅ ์์ฑ์ (Failable Initializers)
์ด๊ธฐํ ๊ณผ์ ์ค์ ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์ฑ์๋ฅผ init๋ค์ ๋ฌผ์ํ(?)๋ฅผ ์ฌ์ฉํด ์คํจ๊ฐ ๊ฐ๋ฅํ ์์ฑ์๋ผ๊ณ ํ์ํ ์ ์๋ค.
NOTEโ๏ธ
์์ฑ์๋ ์ด๋ฆ์ด ๋ฐ๋ก ์๋ ๊ฒ์ด ์๋๋ผ ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐ์์ ์คํจ ๋ถ๊ฐ๋ฅํ ์ด๊ธฐ์๋ฅผ ๊ฐ์ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ์ด๋ฆ์ผ๋ก ๋์์ ์ฌ์ฉํ ์ ์๋ค. ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐ์๋ ๋ฐํ๊ฐ์ผ๋ก ์ต์ ๋ ๊ฐ์ ์์ฑํ๋ค. ์ด๊ธฐํ์ ์คํจํ๋ ๋ถ๋ถ์์ nil์ ๋ฐํํ๋ ์ฝ๋๋ฅผ ์์ฑํด ์ด๊ธฐํ๊ฐ ์คํจํ๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์๋ค.
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty { return nil }
self.species = species
}
}
์ด๊ฑฐํ์์ ์ฌ์ฉํ๋ ์คํจ ๊ฐ๋ฅํ ์์ฑ์ (Failable Initializers for Enumerations)
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
}
}
}
ํ์ ์์ฑ์ (Required Initializers)
๋ชจ๋ ์๋ธํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ์ด๊ธฐ์์๋ ์๋ ์์ ์ ๊ฐ์ด required ํค์๋๋ฅผ ๋ถ์ฌ ์ค๋ค.
class SomeClass {
required init() {
// initializer implementation goes here
}
}
NOTEโ๏ธ
ํ์์ด๊ธฐ์ ํ์๋ฅผ ํด๋ ๊ผญ ๊ตฌํ์ ํ ํ์๋ ์๋ค.
ํด๋ก์ ๋ ํจ์๋ฅผ ์ด์ฉํด ๊ธฐ๋ณธ ํ๋กํผํฐ ๊ฐ์ ์ค์ ํ๊ธฐ (Setting a Default Property Value with a Closure or Function)
๊ธฐ๋ณธ ๊ฐ ์ค์ ์ด ๋จ์ํ ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ๋ณต์กํ ๊ณ์ฐ์ ํ์ํ๋ค๋ฉด ํด๋ก์ ๋ ํจ์๋ฅผ ์ด์ฉํด ๊ฐ์ ์ด๊ธฐํ ํ๋๋ฐ ์ด์ฉํ ์ ์๋ค.
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
}()
}
someProperty๋ ํด๋ก์ ๊ฐ ์คํ๋ ํ ๋ฐํ ํ์ ์ด SomeType์ธ SomeValue๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ๊ฐ๊ฒ ๋๋ค.
NOTEโ๏ธ
ํด๋ก์ ๋ฅผ ์ด๊ธฐ์์์ ์ฌ์ฉํ๋ฉด ํด๋ก์ ์์ self๋ ๋ค๋ฅธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ํด๋ก์ ๊ฐ ์คํ๋ ์์ ์ ๋ค๋ฅธ ํ๋กํผํฐ๋ ์ด๊ธฐํ๊ฐ ๋ค ๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
'๐ฆ Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Inheritance (0) | 2022.07.05 |
---|---|
Subscripts (0) | 2022.07.04 |
Methods (0) | 2022.07.04 |
Properties (0) | 2022.07.04 |
Structures and Classes (0) | 2022.06.22 |