์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. Swift ์คํฐ๋๋ฅผ ์งํํ๋ฉด์ 4์ผ๊ฐ ๊ณต๋ถํ๋.. ์์ฑ์ ์ฑํฐ๋ฅผ ์ ๋ก๋ํด๋ณผ๊ฒ์. ์ ๋ง ๊ธธ๊ณ ๊ธธ์ด์ ์ง๋ฃจํ์ด์.. ๊ทผ๋ฐ๋ ์์ ํ ์ดํด๋ ์์ง ๋ชปํ๋ค๋ ๊ฒ์ด ํจ์ !! ๋น ๋ฅด๊ฒ ํ๊ณ ์ง๋๊ฐ๋๊ฒ ๋ชฉํ์์ด์ ์์ ํ ์ดํด๋ ํ๋ค์์ง๋ง, ์ ์์ฑ์๋ ์ด๋ด๋ ์ฌ์ฉํ๋๊ตฌ๋ ์ด๋ด๋ ์๋๋๊ตฌ๋! ์ด๋ฐ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋ค์ง๋ ์๊ฐ์ด์์ด์. ์์ผ๋ก ์์ฑ์์๋ํด์ ๋ค์ํ๋ฒ ์ ๋ ํ๋ฉด์ ๊ถ๊ธํ ์ ์ ๋ํด์ ํฌ์คํ ํ๋๋ก ํด์ผ๊ฒ ์ด์.
Swift Document chap.14 initialization ๋ฐ๋ก๊ฐ๊ธฐ
Initialization (์์ฑ์)
Initialization(์์ฑ์)๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์์ ์ธ์คํด์ค๋ฅผ ์ค๋นํ๊ธฐ ์ํ ๊ณผ์ ์ด๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ค๋ง๋ค ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ฃผ๊ณ ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํ์ํ ์ค์ ๊ณผ ์ด๊ธฐํ๋ฅผ ์ํํ๋ ๊ณผ์ ์ด ํฌํจ๋๋ค.
๊ฐ๊ฐ์ ํ์ ์์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ ํน์ํ ๋ฉ์๋์ ๊ฐ์ ์ญํ ์ ํ๋ ์์ฑ์๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. Swift์์์ ์์ฑ์๋ ๊ฐ์ ๋ฐํํ์ง ์๋๋ค. ์์ฑ์์ ๊ฐ์ฅ ์ค์ํ ์ญํ ์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์ฒ์ ์ฌ์ฉ๋๊ธฐ ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํ ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๊ฒ์ด๋ค. ํด๋์ค ์ธ์คํด์ค๋ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ deinitializer(์๋ฉธ์)๋ ์ง์ํ๋ค.
์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ํ ์ด๊ธฐ๊ฐ ์ค์
์ธ์คํด์ค์ ์ ์ฅ ํ๋กํผํฐ๋ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฐ๋์ ํน์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ๋์ด์ผ ํ๋ค. ์ด ๊ฐ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ์ ์๊ณ , ํน์ ๊ฐ์ ์ค์ ํ ์๋ ์๋ค.
Initializer์์ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ์ง์ ์ค์ ํ๋ฉด ํ๋กํผํฐ ์ต์ ๋ฒ๊ฐ ํธ์ถ๋์ง ์๊ณ ๊ฐ ํ ๋น์ด ์ํ๋๋ค.
์ด๋์ ๋ผ์ด์ (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"
๊ธฐ๋ณธ ํ๋กํผํฐ (Defalut Property Values)
ํ๋กํผํฐ ์ ์ธ๊ณผ ๋์์ ๊ฐ์ ํ ๋นํ๋ฉด ๊ทธ ๊ฐ์ ์ด๊ธฐ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
โท 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
โท ์ฝ๋ ์ค๋ช
- Celsius ๊ตฌ์กฐ์ฒด์๋ ์์ฑ์๊ฐ ๋ ๊ฐ
- ๋ ๊ฐ์ ์์ฑ์๋ ์๋ก ๋ค๋ฅธ ์์ฑ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, ํด๋น ์์ฑ์์ ๋ง๊ฒ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด ํด๋น ์์ฑ์๊ฐ ํธ์ถ
Parameter Names and Argument Labels
ํจ์์ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ์์ฑ์ ๋ด๋ถ์์ ์ฌ์ฉ๋ ๋งค๊ฐ๋ณ์๋ ์ด๋ฆ๊ณผ ์์ฑ์๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉ๋ Argument Label (์ธ์ ๋ ์ด๋ธ) ์ ๊ฐ์ง ์ ์๋ค. ํ์ง๋ง ์์ฑ์๋ ์ด๋ฆ์ด ์๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ๊ณผ ํ์ ์ ์์ฑ์๋ฅผ ๊ตฌ๋ถํ๋๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค. ์ด๋ฌํ ์ด์ ๋ก Swift ์์ฑ์๋ ๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก ์ธ์ ๋ ์ด๋ธ์ ์์ฑํ์ง ์์ผ๋ฉด ์๋์ ์ผ๋ก ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ๋ํด ์ธ์ ๋ ์ด๋ธ์ ์ ๊ณตํ๋ค.
๋ค์ ์ฝ๋๋ ์ด๊ธฐํ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ 3๊ฐ ์ ๋ ฅ๋ฐ๋ ์ด๋์ ๋ผ์ด์ ์ ํ๋๋ง ์ ๋ ฅ๋ฐ๋ ์ด๋์ ๋ผ์ด์ ์ ์์ ์ด๋ค.
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
}
}
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let halfGray = Color(white: 0.5)
let veryGreen = Color(0.0, 1.0, 0.0)
// ERROR!!!! - ์ธ์์ด๋ฆ ์์จ์ ์๋ฌ๊ฐ ๋จ
// this reports a compile-time error - argument labels are required
์์์ ์ ์ํ๋๋ก Color์ธ์คํด์ค๋ฅผ ์ธ์๊ฐ 3๊ฐ ํน์ ํ๋๋ฅผ ์ด์ฉํด ์์ฑํ ์ ์๋ค. ์ฝ๋ ๋ง์ง๋ง์ค์์๋, ์ธ์์ด๋ฆ์ ์์ฑํ์ง ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Initializer Parameters Without Argument Labels
์ฝ๋๋ฅผ ์์ฑํ ๋ ์ธ์ ๋ ์ด๋ธ์ ์๋ตํ๋ ๊ฒ์ด ๋ ๋ช ๋ฃํ ๊ฒฝ์ฐ _ ๊ธฐํธ๋ฅผ ์ฌ์ฉํด ์ด๋์ ๋ผ์ด์ ์์ ์ธ์ ๋ ์ด๋ธ์ ์๋ตํ ์ ์๋ค. ๋ง์ง๋ง์ ์์๋ฅผ ์ ์ธํ๋ ๋ผ์ธ์ ๋ณด๋ฉด ์ธ์๋ ์ด๋ธ ์์ด ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํ ํ ๊ฒ์ ๋ณผ ์ ์๋ค.
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
**init(_ celsius: Double) {
temperatureInCelsius = celsius
}**
}
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius is 37.0
์ต์ ๋ ํ๋กํผํฐ ํ์
ํ๋กํผํฐ ์ต์ด ๊ฐ์ด ์๊ณ ๋์ค์ ์ถ๊ฐ๋ ์ ์๋ ๊ฐ์ ์ต์ ๋๋ก ์ ์ธํด ์ฌ์ฉํ ์ ์๋ค. ์ต์ ๋ ํ๋กํผํฐ๋ ์๋์ผ๋ก nil๋ก ์ด๊ธฐํ ๋๋ค.
class SurveyQuestion {
var text: String
**var response: String?**
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// Prints "Do you like cheese?"
cheeseQuestion.response = "Yes, I do like cheese."
์ด๊ธฐํ ์ค์ ์์ ํ๋กํผํฐ ํ ๋น
์ด๋์ ๋ผ์ด์ ์์๋ ์์ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. (๐๐ปํด๋์ค ์ธ์คํด์ค์์ ์์ ํ๋กํผํฐ๋ ์ด๊ธฐํ ์ค ๊ทธ ํด๋์ค ์์์๋ง ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๊ณ ์๋ธํด๋์ค์์๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค)
class SurveyQuestion {
**let text: String**
var response: String?
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let beetsQuestion = SurveyQuestion(text: "How about beets?")
beetsQuestion.ask()
// Prints "How about beets?"
beetsQuestion.response = "I also like beets. (But not with cheese.)"
ํ๋กํผํฐ๋ฅผ let์ผ๋ก ์ ์ธํด์ ์ด ํ๋กํผํฐ๋ ์ฒ์์ ์ด๊ธฐํ ๋๋ฉด ๋ณ๊ฒฝ๋์ง ์๋ ํ๋กํผํฐ๋ผ๋ ๊ฒ์ ํํํ ์ ์๋ค.
let์ผ๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Default Initializers (๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ )
๋ง์ฝ ๋ชจ๋ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ์ด ์ค์ ๋ผ ์๊ณ , ํ๋์ ์ด๊ธฐ์๋ ์ ์ํ์ง ์์๋ค๋ฉด, Swift๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ ๊ณตํ๋ค.
์๋ ์ฝ๋๋ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ์ํ์ง ์์๋ค๋ฉด Swift๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ ShoppingListItem()๋ฅผ ์ฌ์ฉํ ์ ์์์ ๋ณด์ฌ์ฃผ๋ ์์ ์ด๋ค.
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
๊ตฌ์กฐ์ฒด ํ์ ์ ๋ฉค๋ฒ ๋ณ ์์ฑ์ (memberwise initializer)
๊ตฌ์กฐ์ฒด๋ ์์ฑ์๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด memberwise initializer(๋ฉค๋ฒ ๋ณ ์์ฑ์)๋ฅผ ์๋์ผ๋ก ๋ฐ๋๋ค. Default ์์ฑ์์๋ ๋ค๋ฅด๊ฒ ์ ์ฅ ํ๋กํผํฐ์ default ๊ฐ์ด ์์ ๋, memberwise initializer ๋ฅผ ๋ฐ๊ฒ๋๋ค. memberwise initializer๋ ์๋ก์ด ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค์ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ค. ์๋ก์ด ์ธ์คํด์ค์ ํ๋กํผํฐ์ ๋ํ ์ด๊ธฐ ๊ฐ์, ์ด๋ฆ์ผ๋ก memberwise intitializer์ ์ ๋ฌํ๋ค.
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)
๊ฐ ํ์ ์ ์ํ Initializer Delegation
์์ฑ์๋ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ์ธ์คํด์ค ์ด๊ธฐํ์ ์ผ๋ถ๋ฅผ ์ํํ ์ ์๋ค. Initializer Delegation (์์ฑ์ ์์)์ด๋ผ๊ณ ํ๋ ์ด๋ฌํ ๊ณผ์ ์ ์์ฑ์์์ ์ฝ๋๊ฐ ์ค๋ณต๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๊ฐํ์ ์ธ์ง ์ฐธ์กฐํ์ ์ธ์ง์ ๋ฐ๋ผ์ Initialzier Delegation ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค. ๊ฐํ์ ์ฆ ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ์์๋ ์์์ ์ง์ํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ด๋ค์ Initializer delegation์ ์์ ์ด ์ ๊ณตํ๋ ์์ฑ์์๊ฒ๋ง ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋จํ๋ค. ํ์ง๋ง ํด๋์ค๋ ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ํ๋ ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ๊ฐ ์ด๊ธฐํ ์ค์ ์ ์ ํ ๊ฐ์ด ํ ๋น๋๋๋ก ํด์ผํ๋ค.
๊ฐ ํ์ ์์๋ self.init์ผ๋ก ์๋ก์ด ์์ฑ์๋ฅผ ์ ์ํ ๋ ๋ค๋ฅธ ์์ฑ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. self.init์ ์์ฑ์๋ฅผ ์์ฑํ ๋๋ง ํธ์ถํ ์ ์๋ค. ๊ฐํ์ , ์ฆ ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ์์ ์ฌ์ฉ์ ์ ์ ์์ฑ์๋ฅผ ์ ์ํ๋ฉด default์์ฑ์๋ฅผ ๋์ด์ ์ ๊ทผํ ์ ์๋ค. ์ด๋ฌํ ์ ์ฝ์ ์์ฑ์๋ฅผ ๋ง๋ค์ด๋์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ์ฌ์ฉํ ๋ ์ด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ํ๊ฒ ๋๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ์ด๋ฌํ ์ ์ฝ์ด ์ซ๊ณ default ์์ฑ์๋ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์ ์ ์ ์์ฑ์๋ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ฌ์ฉ์ ์ ์ ์์ฑ์๋ฅผ extension์ผ๋ก ์ ์ธํ๋ฉด ๋๋ค.
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
์ ์ฝ๋์์ Rect ๊ตฌ์กฐ์ฒด์๋ ์ธ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์์ฑ์๊ฐ ์กด์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ ํ๋กํผํฐ์ธ orgin, size ๋ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค ํ์ ์ธ๋ฐ ์ด ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํ๋ ์์ฑ์์ ๋งค๊ฐ๋ณ์์ ํด๋นํ๋ Size, Point ๊ตฌ์กฐ์ฒด๋ ๋ชจ๋ default ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก Rect ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
let basicRect = Rect()
// basicRect's origin is (0.0, 0.0) and its size is (0.0, 0.0)
let originRect = Rect(origin: Point(x: 2.0, y: 2.0),
size: Size(width: 5.0, height: 5.0))
// originRect's origin is (2.0, 2.0) and its size is (5.0, 5.0)
์ฒซ๋ฒ์งธ์ Rect() ๊ฒฝ์ฐ, init() ์์ฑ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ด๋ค. default ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ธฐ๋ฅ์ ์ผ๋ก ๋์ผํ๋ค.
๋๋ฒ์งธ Rect(origin: Point: (x, y), size: Size(width, height))์ ๊ฒฝ์ฐ init(origin: size:) ์์ฑ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ด๊ณ , Rect(center: Point(x, y), size: Size(width, height))๋ init(center: size) ์์ฑ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ด๋ค.
ํด๋์ค ์์๊ณผ ์์ฑ์
๋ชจ๋ ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ์ superclass๋ก๋ถํฐ ์์๋ฐ์ ๋ชจ๋ ํ๋กํผํฐ๋ ์ด๊ธฐํ ๋จ๊ณ์์ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ด ํ ๋น๋์ด์ผ ํ๋ค. Swift์์๋ ํด๋์ค ํ์ ์์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ด๊ธฐ ๊ฐ์ ๊ฐ๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ๋ค.
์ง์ ์์ฑ์์ ํธ์ ์์ฑ์ (Designated Initializers and Convenience Initializers)
Designated Initializers(์ง์ ์์ฑ์)๋ ํด๋์ค์ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์์ด๋ค. ์ง์ ์์ฑ์๋ ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํํ๊ณ ์ ์ ํ ์ํผ ํด๋์ค์ ์์ฑ์๋ ํธ์ถํ์ฌ ์ํผ ํด๋์ค์ ํ๋กํผํฐ๋ค๋ ์ด๊ธฐํํ๋ค. ํด๋์ค์๋ ํ๋์ ์ง์ ์์ฑ์๊ฐ ์๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์ง์ ์์ฑ์๊ฐ ํธ์ถ๋๋ ์ง์ ์ "funnel"์ง์ ์ผ๋ก ์ด๊ธฐํ ํ๋ก์ธ์ค๊ฐ ์ํผ ํด๋์ค ์ฒด์ธ์ ๊ณ์ํ๋ ์ง์ ์ด๋ค.
๋ชจ๋ ํด๋์ค๋ ์ ์ด๋ ํ๋์ ์ง์ ์์ฑ์๊ฐ ์์ด์ผํ๋ค. ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ๊ณง ๋์ฌ Automatic Initializer Inheritance์ ์ค๋ช ๋ ๋๋ก ์ํผ ํด๋์ค์์ ํ๋ ์ด์์ ์ง์ ์์ฑ์๋ฅผ ์์ํ์ฌ ์ถฉ์กฑ๋๋ค.
Convenience Initializers(ํธ์ ์์ฑ์)๋ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ณด์กฐํ๋ ์ญํ ์ ํ๋ค. ํด๋์ค์ ํน์ํ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๊ธฐ ์ํด ํธ์ ์ด๊ธฐํ๋ฅผ ์ ์ํ ์๋ ์๋ค. ๋ง์ฝ ์ด๋ฌํ ํธ์ ์์ฑ์๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๊ตณ์ด ์ ๊ณตํ ํ์๋ ์๋ค.
์ง์ ์์ฑ์์ ํธ์ ์์ฑ์์ ๋ฌธ๋ฒ
ํด๋์ค์ ์ง์ ์์ฑ์์ ๋ฌธ๋ฒ์ ๊ฐ ํ์ ์์ฑ์์ ๊ฐ๋ค.
init(parameters) {
statements
}
ํธ์์์ฑ์๋ ๊ธฐ๋ณธ ์์ฑ์์ ๋ฌธ๋ฒ์ด ๊ฐ์ง๋ง init์์ convenience ํค์๋๋ฅผ ๋ถ์ธ๋ค.
convenience init(parameters) {
statements
}
ํด๋์ค ํ์ ์ ์ํ ์์ฑ์ ์์ (Initializer Delegation)
์ง์ ์์ฑ์์ ํธ์ ์์ฑ์์ ๊ด๊ณ๋ฅผ ๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํด Swift๋ ์์ฑ์์ delegation์ ๋ค์ ์ธ ๊ฐ์ง ๊ท์น์ ์ ์ฉํ๋ค.
- RULE 1) ์ง์ ์์ฑ์๋ ํธ์ถ ์ฆ์ ์ํผ ํด๋์ค์ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํ๋ค.
- RULE 2) ํธ์ ์์ฑ์๋ ๊ฐ์ ํด๋์ค ๋ด์ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
- RULE 3) ํธ์ ์์ฑ์๋ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํด์ผ๋ง ํ๋ค.
์ฆ, designated initializer๋ ํญ์ delegate UP ํด์ผํ๊ณ , Convenience initializer๋ ํญ์ delegate across ํด์ผํ๋ค.
์ ๊ทธ๋ฆผ์์ ์ํผํด๋์ค๋ ํ๋์ ์ง์ ์์ฑ์์ ๋ ๊ฐ์ ํธ์ ์์ฑ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํ๋์ ํธ์ ์์ฑ์๋ ๋ค๋ฅธ ํธ์ ์์ฑ์๋ฅผ ํธ์ถํ๊ณ , ๋ค์ ํ๋์ ์ง์ ์์ ์๋ฅผ ํธ์ถํ๋ค. ์ด๋ ์์ ๊ท์น 2, 3์ ๋ง์กฑํ๋ค. ์ํผํด๋์ค ์์ฒด์๋ ์ถ๊ฐ ์ํผ ํด๋์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ท์น 1์ ์ ์ฉ๋์ง ์๋๋ค.
์์ ๊ทธ๋ฆผ์์ ์๋ธํด๋์ค๋ ๋ ๊ฐ์ ์ง์ ์์ฑ์์ ํ๋์ ํธ์ ์์ฑ์๊ฐ ์๋ค. ํธ์ ์์ฑ์๋ ๋์ผํ ํด๋์ค ์์ฑ์๋ง ํธ์ถ ํ ์ ์๊ธฐ ๋๋ฌธ์, ์ง์ ์์ฑ์๋ง ํธ์ถ ๊ฐ๋ฅํ๋ค. ๋จ์ ์ง์ ์์ฑ์๋ค์ ๊ท์น 1์ ์ํด ์ํผํด๋์ค์ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํธ์ถํ๊ณ ์์์ ๋ณผ ์ ์๋ค. ์ด๋ ๊ฒ ๊ท์น 1,2,3 ์ ๋ชจ๋ ์ค์ํ๊ณ ์๋ค.
์ด๋ฌํ ๊ท์น์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์๋ ์ํฅ์ ๋ผ์น์ง ์๋๋ค. ์ค๋ก์ง ํด๋์ค์ ์์ฑ์ ๊ตฌํ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ง ์ํฅ์ ์ฃผ๋ ๊ท์น๋ค์ด๋ค.
๋ค์์ ์ข ๋ ๋ณต์กํ ์์ฑ์ ์์์ ํํ์ด๋ค.
- ์ ๊ทธ๋ฆผ์์๋ ๋ชจ๋ ์๋ธํด๋์ค์ designated initializer๊ฐ ๋ชจ๋ ์ํผํด๋์ค์ designated initalizer ๋ฅผ ํธ์ถํ๊ณ ์์์ ๋ณผ ์ ์๋ค. (delegate UP)
- ๋ ๋ชจ๋ Convenience initializer๋ ๋ค๋ฅธ initializer๋ฅผ ํธ์ถํ๊ณ ์์์ ๋ณผ ์ ์๋ค. (delegate Across)
Two-Phase Initialization (2๋จ๊ณ ์์ฑ์)
Swift์์ ํด๋์ค ์ด๊ธฐํ๋ 2๋จ๊ณ์ ๊ฑฐ์ณ ์งํ๋๋ค. ์ฒซ๋ฒ์งธ ๋จ๊ณ์์๋ ์ ์ฅ ํ๋กํผํฐ์ ํด๋์ค์ ์ํ ์ด๊ธฐ๊ฐ์ด ํ ๋น๋๋ค. ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ ๊ฐ์ด ๊ฒฐ์ ๋๋ฉด ๋ ๋ฒ์งธ ๋จ๊ณ๊ฐ ์์๋๋๋ฐ, ์ด ๋จ๊ณ์์๋ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ธฐ ์ ์ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ ๊ธฐํ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ฌํ ๋ ๋จ๊ณ์ ๊ฑธ์น ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ์ ๊ฐ ํด๋์ค๋ ์์ ํ ์ ์ฐ์ฑ์ ๊ฐ๊ฒ ๋๋ค. ์ด๋ฌํ ๋จ๊ณ๋ ํ๋กํผํฐ์ ๊ฐ์ด ํ ๋น๋๊ธฐ ์ ์๋ ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํ๊ณ ๋ค๋ฅธ ์์ฑ์๊ฐ ํ๋กํผํฐ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ค์ ํ์ง ๋ชปํ๊ฒ ํ๋ค.
Swift ์ปดํ์ผ๋ฌ๋ ๋ค ๊ฐ์ง์ ์์ ์ ๊ฒ์ ์ํํ์ฌ 2๋จ๊ณ ์ด๊ธฐํ๊ฐ ์๋ฃ๋์๋์ง ํ์ธํ๋ค.
- ์์ ์ ๊ฒ 1) Designated ์์ฑ์๋ ์ํผ ํด๋์ค์ ์์ฑ์๊ฐ ์คํ๋๊ธฐ ์ ์ ํด๋น ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํด์ผ ํ๋ค. ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ด ์์ ๋๋ง ์์ ํ ์ด๊ธฐํ ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค. ์ด๋ฌํ ๊ท์น์ ๋ง์กฑํ๋ ค๋ฉด ์ํผ ํด๋์ค์ ์์ฑ์๊ฐ ์คํ๋๊ธฐ ์ ์ ํ์ฌ ์์ฑ ์ค์ธ ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํด์ผํ๋ค.
- ์์ ์ ๊ฒ 2) Designated ์์ฑ์๋ ์์๋ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๊ณ ์ถ๋ค๋ฉด ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ์คํํ ๋ค์ ๊ฐ์ ํ ๋นํด์ผํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ํผ ํด๋์ค์ ์์ฑ์์ ์ํด ๊ฐ์ด ๋ฎ์ด์์์ง๋ค.
- ์์ ์ ๊ฒ 3) Convenience ์์ฑ์๋ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๊ธฐ ์ ์ ๋ค๋ฅธ ์์ฑ์๋ฅผ ์คํํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ฒด ํด๋์ค์ ์์ฑ์์ ์ํด ๊ฐ์ด ๋ฎ์ด์์์ง๋ค.
- ์์ ์ ๊ฒ 4) ์์ฑ์๋ ์ด๊ธฐํ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๊ฐ ์๋ฃ๋ ๋๊น์ง ์ธ์คํด์ค ๋ฉ์๋, ์ธ์คํด์ค ํ๋กํผํฐ, self๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํด๋์ค์ ์ธ์คํด์ค๋ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๊ฐ ๋๋ ๋๊น์ง๋ ์ ํจํ ๊ฐ์ฒด๊ฐ ์๋๋ค. ์ฆ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ฅผ ์๋ฃํด์ผ์ง ํ๋กํผํฐ์ ์ ๊ทผํ๊ฑฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค. ์์ ๋ค ๊ฐ์ง ์์ ์ ๊ฒ์ ์ํด 2 ๋จ๊ณ ์ด๊ธฐํ๊ฐ ์ํ๋๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- 1 ๋จ๊ณ
- ํด๋์ค์์ Designated, convenience ์์ฑ์๋ฅผ ํธ์ถํ๋ค.
- ํด๋์ค์ ์ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค. ํ์ง๋ง ์์ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๊ธฐํ๋ ๊ฒ์ ์๋๋ค.
- Designated ์์ฑ์๋ ํด๋น ํด๋์ค์ ๋ํ ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ด ์์์ ํ์ธํ๋ค. ์ด์ ์ ์ฅ ํ๋กํผํฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๊ธฐํ๋์๋ค.
- ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ์คํํ๋ค.
- ์ต์์ ํด๋์ค์ ๋๋ฌํ ๋ ๊น์ง ๊ณ์ํ๋ค.
- ์ต์์ ํด๋์ค์ ๋๋ฌํ ๋ค ์ต์์ ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ด ์๋์ง ํ์ธํ๋ฉด ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ํ ์ด๊ธฐํ๋ ๊ฒ์ผ๋ก ๋ณด๊ณ 1๋จ๊ณ๋ฅผ ์ข ๋ฃํ๋ค.
- 2๋จ๊ณ
- ์ต์์ ํด๋์ค์์ ๋ค์ ๋ด๋ ค๊ฐ๋ฉด์ ํด๋์ค์ ์ ์๋ designated ์์ฑ์๋ ์ธ์คํด์ค์ ๊ฐ์ ๋ค์ ์ง์ ํ ์ ์๋ ์ต์ ์ด ์๋ค. ์ด๋ฌํ ์์ฑ์๋ ์ด์ ์์ ์ ํ๋กํผํฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ ์ธ์คํด์ค ๋ฉ์๋๋ ํธ์ถํ ์ ์๋ค. ๋ํ ํด๋์ค๋ค์ conveniecne ์์ฑ์๋ ์ธ์คํด์ค๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๊ณ ์์ฒด์ ์ผ๋ก ์์ ์ ์ํํ ์ ์๋ค.
์ ๊ทธ๋ฆผ์ 1๋จ๊ณ์์ ์๋ธํด๋์ค ๋ฐ ์ํผํด๋์ค์ ์์ฑ์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๊ธฐํ๋ ์๋ธํด๋์ค์ convenience ์์ฑ์์ ํธ์ถ์์ ์์๋๋ค. ์์ง convenience ์์ฑ์๋ ํ๋กํผํฐ๋ฅผ ์์ ํ ์ ์์ผ๋ฏ๋ก ๋์ผํ ํด๋์ค์ designated ์์ฑ์๋ฅผ ์คํ์ํจ๋ค. Designated ์์ฑ์๋ ์์ ์ ๊ฒ 1 ์ ๋ฐ๋ผ ์๋ธํด๋์ค์ ํ๋กํผํฐ์ ๊ฐ์ด ์๋์ง ํ์ธํ ๋ค ์ํผํด๋์ค์ designated ์์ฑ์๋ฅผ ํธ์ถํ๋ค. ์ํผํด๋์ค์ designated ์์ฑ์๋ ์ํผํด๋์ค์ ํ๋กํผํฐ์ ๊ฐ์ด ์๋์ง ํ์ธํ๊ณ ๋ ์ด์์ ์ํผํด๋์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ ์์ ํ ์ด๊ธฐํ ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ณ 1๋จ๊ณ๊ฐ ์ข ๋ฃ๋๋ค.
์ ๊ทธ๋ฆผ์ ์ด๊ธฐํ์ 2๋จ๊ณ ์ด๋ค.
์ด์ ์ํผํด๋์ค์ designated ์์ฑ์๋ ์ธ์คํด์ค๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ค. ์ํผํด๋์ค์ designated ์์ฑ์๊ฐ ์๋ฃ๋๋ฉด ์๋ธํด๋์ค์ designated ์์ฑ์๊ฐ ์ปค์คํฐ๋ง์ด์ง์ ์ํํ๊ณ ๊ทธ ํ์ convenience ์์ฑ์๊ฐ ์ถ๊ฐ์ ์ธ ์ปค์คํฐ๋ง์ด์ง์ ์ํํ ์ ์๊ฒ ๋๋ค.
์ด๋์ ๋ผ์ด์ ์ ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ
Swift ์๋ธํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํผํด๋์ค์ ์์ฑ์๋ฅผ ์์ํ์ง ์๋๋ค. ์ด์ ๋ ์ํผํด๋์ค์ ์ด๋์ ๋ผ์ด์ ๊ฐ ๋ฌด๋ถ๋ณํ๊ฒ ์์๋์ด ๋ณต์กํ๊ฒ ๋ผ ์๋ธํด๋์ค์์ ์ด๊ฒ๋ค์ด ์๋ชป ์ด๊ธฐํ ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํจ์ด๋ค. ์ํผํด๋์ค์ ์ด๋์ ๋ผ์ด์ ๋ ์์ ํ๊ณ ์ ๋นํ ํน์ ํ๊ฒฝ์์ ์์๋๋ค.
๋ง์ฝ ํด๋์ค์์ ๋ชจ๋ ํ๋กํผํฐ์ ์ด๊ธฐ ๊ฐ์ด ์ง์ ๋ผ ์๊ณ , ์๋ฌด๋ฐ ์ปค์คํ ์์ฑ์๋ฅผ ์ ์ธํ์ง ์๋๋ค๋ฉด, ๊ธฐ๋ณธ ์์ฑ์ init()์ ์ฌ์ฉํ ์ ์๋ค.
์ํผํด๋์ค์ ์์ฑ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๊ธฐ ์ํด์๋ ์๋ธํด๋์ค์์ ๊ทธ ์์ฑ์์ override ํค์๋๋ฅผ ๋ถ์ด๊ณ ์ฌ์ ์ํ๋ค.
๋ค์ ์์ ๋ ํด๋์ค๋ฅผ ์์ฑํ๊ณ ๊ทธ๊ฒ์ ์๋ธํด๋์ค์์ ์์ฑ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด ์ฌ์ฉํ ์์ ์ด๋ค.
class Vehicle {
var numberOfWheels = 0
var description: String {
return "\\(numberOfWheels) wheel(s)"
}
}
let vehicle = Vehicle()
print("Vehicle: \\(vehicle.description)")
// Vehicle: 0 wheel(s)
์ ์ฝ๋๋ Vehicleํด๋์ค๋ฅผ ์ ์ํ๊ณ numberOfWheels ๋ผ๋ ์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ ์ธํ๋ค. ์ด๋ description ์ด๋ผ๋ ๊ณ์ฐ ํ๋กํผํฐ์์ ๋ฌธ์์ด์ ๋ง๋๋๋ฐ ์ฌ์ฉ๋๋ค. ์ฌ๊ธฐ์ Vehicleํด๋์ค๋ ์ ์ฅ ํ๋กํผํฐ์ default ๊ฐ์ ํ ๋นํ๊ณ , ๋ฐ๋ก ์์ฑ์๋ฅผ ์์ฑํ์ง ์์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ default ์์ฑ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋์ด ์ด๋ฌํ default ์์ฑ์๋ ํด๋์ค์์ ํญ์ designated ์์ฑ์์ด๋ค.
class Bicycle: Vehicle {
override init() {
super.init()
numberOfWheels = 2
}
}
let bicycle = Bicycle()
print("Bicycle: \\(bicycle.description)")
// Bicycle: 2 wheel(s)
์ด๋ฒ์๋ Vehicle ํด๋์ค๋ฅผ ์์๋ฐ๋ Bicycle ํด๋์ค๋ฅผ ์ ์ํ๋ค. Bicycle ํด๋์ค์๋ designated ์์ฑ์์ธ init()์ ์ ์ํด์ฃผ์๋ค. ์ด ์์ฑ์๋ ์ํผํด๋์ค์ธ Vehicle์๋ ์์ผ๋ฏ๋ก override ํค์๋๋ฅผ ์์ ์จ์ ์๋ธํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ ํ๋ค๋ ๊ฒ์ ๊ผญ ๋ช ์ํด์ผ ํ๋ค.
๊ทธ๋ผ ์ด์ Bicycle์ init()์ ์ดํด๋ณด์. ์ด ์์ฑ์๋ super.init(), ์ฆ Vehicle์ ์์ฑ์๋ฅผ ํธ์ถํ๊ณ ์๋ค. Vehicle์ ์์ฑ์๋ numberOfWheels ํ๋กํผํฐ์ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํ๋ ์์ฑ์์์ง๋ง, Bicycle ํด๋์ค์ init()์์ ๋ค์ ์ด๋ฅผ 2๋ก ๋ฐ๊พธ์ด ์ฃผ๊ฒ ๋๋ค. ๋ง์ฝ ์ด๋ฌํ ๋์์์ ์๋ธํด๋์ค์ ์์ฑ์๊ฐ ์ด๊ธฐํ ํ๋ก์ธ์ค์ 2๋จ๊ณ์์ ์ปค์คํ ์์ฑ์๊ฐ ์๊ณ , ์ํผ ํด๋์ค์ designated ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ์์ ๋ ์๋ธ ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ ํ์ super.init()ํธ์ถ์ ์๋ตํ ์๋ ์๋ค.
class Hoverboard: Vehicle {
var color: String
init(color: String) {
self.color = color
// super.init() implicitly called here
}
override var description: String {
return "\\(super.description) in a beautiful \\(color)"
}
}
let hoverboard = Hoverboard(color: "silver")
print("Hoverboard: \\(hoverboard.description)")
// Hoverboard: 0 wheel(s) in a beautiful silver
์ ์ฝ๋๋ Hoverboard๋ผ๋ ์๋ก์ด Vehicle์ ์๋ธํด๋์ค๋ฅผ ์ ์ํ ๊ฒ์ด๋ค. Hoverboard ํด๋์ค์ ์์ฑ์๋ color ํ๋กํผํฐ๋ง ์ด๊ธฐํํ๋ค. ์ด ์์ฑ์๋ super.init()์ ์์์ ์ผ๋ก ํธ์ถํ์ฌ ์ด๊ธฐํ ํ๋ก์ธ์ค๋ฅผ ์๋ฃํ๋ค. ํ๋ ๋ง ๋ถ์ด์๋ฉด ์๋ธ ํด๋์ค๋ ์์๋ ๋ณ์ ํ๋กํผํฐ์ ๊ฐ์ ์์ ํ ์ ์์ง๋ง ์์๋ ์์ ํ๋กํผํฐ์ ๊ฐ์ ์์ ํ ์ ์๋ค.
์๋ ์์ฑ์ ์ธ์คํด์ค
์์์ ์ธ๊ธํ๋ฏ์ด, ์๋ธํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํผํด๋์ค์ ์์ฑ์๋ฅผ ์์ํ์ง ์๋๋ค. ํ์ง๋ง ํน์ ์กฐ๊ฑด์์๋ ์ํผํด๋์ค์ ์์ฑ์๊ฐ ์๋์ผ๋ก ์์๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ํน์ ์กฐ๊ฑด์์ ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ์์ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์๋ธํด๋์ค์ ์ ์ํ ์๋ก์ด ํ๋กํผํฐ์ default ๊ฐ์ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์ ๋ ๊ฐ์ง์ ๊ท์น์ด ์ ์ฉ๋๋ค.
- Rule 1
- ์๋ธ ํด๋์ค๊ฐ designated ์์ฑ์๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด ์๋์ ์ผ๋ก ์ํผ ํด๋์ค์ designated ์์ฑ์๋ฅผ ๋ชจ๋ ์์๋ฐ๋๋ค.
- Rule 2
- ์๋ธ ํด๋์ค๊ฐ Rule 1์ ๋ฐ๋ผ ์์ํ๊ฑฐ๋ ์ํผ ํด๋์ค์ ๋ชจ๋ designated ์์ฑ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ ๊ตฌํํ๋ฉด ์ํผ ํด๋์ค์ convenience ์์ฑ์๋ ์๋์ผ๋ก ์์๋ฐ๋๋ค. ์ด๋ฌํ ๊ท์น์ ์๋ธ ํด๋์ค์ convenience ์์ฑ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์๋ ์ ์ฉ๋๋ค.
์ง์ ์์ฑ์(Designated)์ ํธ์ ์์ฑ์์(convenience) ์ฌ์ฉ
๊ทธ๋ผ designated ์์ฑ์, Convenience ์์ฑ์, Automatic ์์ฑ์์ ์์์ด ๋์ํ๋ ๋ชจ์ต์ ์ดํด๋ณด์.
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]")
}
}
ํธ์์ด๊ธฐ์ convenience.init() ์์ ์ง์ ์ด๊ธฐ์ init(name: String)์ด ํธ์ถ๋๋ ํํ์ด๋ค.
์ฐ์ ์ํผํด๋์ค Food ๋ผ๋ ํด๋์ค๋ฅผ ์ ์ํ๋ค. ์ด๋ ์ํ์ ํ๋ฆ์ ์บก์ํํ๋ ํด๋์ค์ด๊ณ , 2๊ฐ์ ์์ฑ์๊ฐ ์กด์ฌํ๋ค.
์ ๊ทธ๋ฆผ์ Food ํด๋์ค์ ์์ฑ์์ ๊ด๊ณ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. Food ํด๋์ค์๋ default memberwise ์์ฑ์๊ฐ ์๊ธฐ ๋๋ฌธ์ designated ์์ฑ์์ธ init(name: )๋ฅผ ์ ๊ณตํ๋ค.
let namedMeat = Food(name: "Bacon")
// namedMeat's name is "Bacon"
let mysteryMeat = Food()
// mysteryMeat's name is "[Unnamed]"
init(name: )์์ฑ์๋ฅผ ์ฌ์ฉํด์ Food ํด๋์ค์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. Food์๋ ์ธ์ ์์ด ์ฌ์ฉ๊ฐ๋ฅํ ์์ฑ์์ธ init() ๋ ์ ์๋์ด ์๊ณ , ์ด๋ฅผ ํตํด์๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
๊ทธ๋ผ ์ด์ 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)
}
}
let oneMysteryItem = RecipeIngredient()
let oneBacon = RecipeIngredient(name: "Bacon")
let sixEggs = RecipeIngredient(name: "Eggs", quantity: 6)
RecipeIngredient ํด๋์ค๋ผ๋ ์๋ธํด๋์ค๋ฅผ ๋ง๋ค์๋ค. ์ด๋ quantity๋ผ๋ ์ ์ฅํ๋กํผํฐ๊ฐ ์๋ก ์ ์๋์ด์๊ณ , ์์ฑ์๋ 2๊ฐ๊ฐ ์กด์ฌํ๋ค.
์์ ๊ทธ๋ฆผ์ RecipeIngredient ํด๋์ค์ ์์ฑ์๋ค์ ๊ด๊ณ๋ฅผ ๋ํ๋ธ ๊ทธ๋ฆผ์ด๋ค. RecipeIngredient ํด๋์ค์๋ init(name: quantity:)๋ผ๋ designated ์์ฑ์๊ฐ ์๊ณ ์ด ์์ฑ์์ ์ํด ์๋ก ์ ์๋ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๋ค.
๊ทธ๋ฆฌ๊ณ super.init(name:)์ ํธ์ถํ๊ฒ ๋๋ฉฐ 2๋จ๊ณ ์ด๊ธฐํ์ ์์ ์ ๊ฒ 1์ ๋ง์กฑํ๊ฒ ๋๋ค. RecipeIngredient ํด๋์ค๋ convenience ์์ฑ์์ธ init(name:String)๋ก ์ ์๋์ด์๋๋ฐ ์ด๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ๋๋ค. ํ์ง๋ง ์ด ์์ฑ์๋ ์ํผ ํด๋์ค์ธ Food์์๋ ๋์ผํ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ์์ฑ์๊ฐ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ override๋ฅผ ์์ ์จ์ค์ผ ํ๋ค.
RecipeIngredient๋ convenience ์์ฑ์๋ก init(name:)์ ์ ๊ณตํ์ง๋ง ์ํผํด๋์ค์ designated ์์ฑ์๋ฅผ ๋ชจ๋ ์ ๊ณตํ์ผ๋ฏ๋ก Food ํด๋์ค์ convenience ์์ฑ์๋ ๋ชจ๋ ์์๋ฐ๊ฒ ๋๋ค. ์ฆ Food์ init() ์์ฑ์๋ฅผ ์์๋ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค.
class ShoppingListItem: RecipeIngredient {
var purchased = false
var description: String {
var output = "\\(quantity) x \\(name)"
output += purchased ? " โ" : " โ"
return output
}
}
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 โ
์ด๋ฒ์ RecipeIngredient ํด๋์ค๋ฅผ ์์๋ฐ๋ ShoppingListItem ํด๋์ค๋ฅผ ์ ์ํด๋ณด์๋ค. ์ด ํด๋์ค์๋ ์ ์ฅ ํ๋กํผํฐ purchased์ ๊ณ์ฐ ํ๋กํผํฐ์ธ description์ด ์ ์๋์ด์๋ค. ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ด ํ ๋น๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์์ฑ์๋ฅผ ์ ์ํ์ง ์์๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ์ ์ ์๋ค. ShoppingListItem ํด๋์ค๋ ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ ์ ๊ณตํ๊ณ ์์ฑ์ ์์ฒด๋ฅผ ์ ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ํผํด๋์ค์์ ์ ์๋ ๋ชจ๋ ์์ฑ์๋ฅผ ์์๋ฐ๋๋ค. ๋ฐ๋ผ์ ์์ ์ฝ๋์ฒ๋ผ ShoppingListItem์ ์ธ์คํด์ค๋ค์ ๋ง๋ค ์ ์๋ค.
์ ๊ทธ๋ฆผ์ ์ง๊ธ๊น์ง ์ ์ ์ธ ํด๋์ค์ ์์ฑ์ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋ค.
Failable Initializers (์คํจ ๊ฐ๋ฅํ ์์ฑ์)
์ด๊ธฐํ ๊ณผ์ ์ค์ ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์ฑ์๋ฅผ init ๋ค์ ๋ฌผ์ํ(?) ๋ฅผ ์ฌ์ฉํด ์คํจ ๊ฐ๋ฅํ ์์ฑ์๋ผ๊ณ ํํํ ์ ์๋ค.
์์ฑ์๋ ์ด๋ฆ์ด ๋ฐ๋ก ์๋ ๊ฒ์ด ์๋๋ผ ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ์คํจ๊ฐ๋ฅํ ์์ฑ์์ ์คํจ ๋ถ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ๊ฐ์ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ์ด๋ฆ์ผ๋ก ๋์์ ์ฌ์ฉํ ์ ์๋ค. ์คํจ ๊ฐ๋ฅํ ์์ฑ์๋ ๋ฐํ๊ฐ์ผ๋ก ์ต์ ๋ ๊ฐ์ ์์ฑํ๋ค. ์ด๊ธฐํ์ ์คํจํ๋ ๋ถ๋ถ์์ nil์ ๋ฐํํ๋ ์ฝ๋๋ฅผ ์์ฑํด ์ด๊ธฐํ๊ฐ ์คํจํ๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์๋ค.
์์ฐํ ๋งํ๋ฉด ์์ฑ์ init์ ๊ฐ์ ๋ฐํํ์ง ์๋๋ค. ๊ทธ๋์ ๋น๋ก nil์ ๋ฐํํ๋ return nil ์ฝ๋์๋ ์ฌ์ฉํ์ง๋ง init์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ return ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
๋ค์ ์ฝ๋๋ ์ซ์ํ์ ์ํด ์ ์๋ผ ์๋ ์คํจ ๊ฐ๋ฅํ ์์ฑ์ Int(exactly: )๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ค.
let wholeNumber: Double = 12345.0
let pi = 3.14159
if let valueMaintained = Int(exactly: wholeNumber) {
print("\\(wholeNumber) conversion to Int maintains value of \\(valueMaintained)")
}
// Prints "12345.0 conversion to Int maintains value of 12345"
let valueChanged = Int(exactly: pi)
// valueChanged is of type Int?, not Int
if valueChanged == nil {
print("\\(pi) conversion to Int does not maintain value")
}
// Prints "3.14159 conversion to Int does not maintain value"
์ ์ฝ๋์ ๊ฐ์ด ์ซ์ ํ์ ๊ฐ ๋ณํ์์ ๊ฐ์ ์ ํํ๊ฒ ์ ์งํ๋ ค๋ฉด init(exactly: ) ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ง์ฝ ๋ณํ ํ ๊ฐ์ ์ ์งํ ์ ์๋ค๋ฉด, ์์ฑ์๊ฐ ์คํจํ๊ฒ ๋๋ค. ์ฆ ์์ผ ์ฝ๋์์ 12345.0์ Int๋ก ๋ณํํด๋ ๊ฐ์ด ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฐ์ด ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฐ์ด ์ ์ด๊ธฐํ ๋์ง๋ง, 3.14159๋ฅผ Int ๋ก ๋ณํํ๋ฉด 3์ธ๋ฐ ์ด๋ ๊ฐ์ด ์ ์ง๋์ง ์์ผ๋ฏ๋ก ์ด๊ธฐํ์ ์คํจํ๊ฒ ๋๋ค.
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty { return nil }
self.species = species
}
}
let someCreature = Animal(species: "Giraffe")
// someCreature is of type Animal?, not Animal
if let giraffe = someCreature {
print("An animal was initialized with a species of \\(giraffe.species)")
}
// Prints "An animal was initialized with a species of Giraffe"
let anonymousCreature = Animal(species: "")
// anonymousCreature is of type Animal?, not Animal
if anonymousCreature == nil {
print("The anonymous creature couldn't be initialized")
}
// Prints "The anonymous creature couldn't be initialized"
์ ์ฝ๋์์๋ Animal ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ๊ณ init? ์ด๋ผ๋ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์ ์ํ๋ค.์ด ์์ฑ์๋ ๋ง์ฝ ๋น ๋ฌธ์์ด์ด ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์ค๋ฉด ์ด๊ธฐํ๋ฅผ ์คํจํ๊ฒ ๋๋๋ก ์ ์๋์ด ์๋ค. ์ค์ ๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด ๋น ๋ฌธ์์ด์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ ฅํ๊ฒ ๋๋ฉด ์ด๊ธฐํ์ ์คํจํ๊ฒ ๋๋ค.
์ด๊ฑฐํ์์ ์ฌ์ฉํ๋ Failable ์์ฑ์
์ด๊ฑฐํ์์๋ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์์ ๋ฅผ ๋ณด์.
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
}
}
}
let fahrenheitUnit = TemperatureUnit(symbol: "F")
if fahrenheitUnit != nil {
print("This is a defined temperature unit, so initialization succeeded.")
}
// Prints "This is a defined temperature unit, so initialization succeeded."
let unknownUnit = TemperatureUnit(symbol: "X")
if unknownUnit == nil {
print("This is not a defined temperature unit, so initialization failed.")
}
// Prints "This is not a defined temperature unit, so initialization failed."
์ ์ฝ๋์์๋ ์ด๊ธฐํ ์ ์ง์ ๋ ํน์ ์จ๋ ํ์ ๋จ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๊ธฐํ ๊ฒฐ๊ณผ๋ก nil์ ๋ฐํํ๋ค. Temperatureunit(symbol: “F”) ์์ F๋ TempertureUnit ์ด๊ฑฐํ์์ ์ฌ์ ์ ์ ์๋์ด ์๋ ๋จ์์ฌ์ ์ด๊ธฐํ๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋ค.
ํ์ง๋ง TemperatureUnit(symbol: "X")์์ X๋ ์ ์๋์ง ์์ ๋จ์์ฌ์ ์ด๊ธฐํ์ ์คํจํ๊ฒ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Raw ๊ฐ์ ์ฌ์ฉํ๋ ์ด๊ฑฐํ์์์ Failable ์์ฑ์
์ด๊ฑฐํ์ ๊ฐ ์ผ์ด์ค์ ์ง์ ๋ผ ์๋ Raw ๊ฐ์ ์์ฑ์ ์ธ์๋ก ๋ฃ์ด ์ด๊ธฐํ์ ์ฌ์ฉํ ์ ์๋ค.
enum TemperatureUnit: Character {
case kelvin = "K", celsius = "C", fahrenheit = "F"
}
let fahrenheitUnit = TemperatureUnit(rawValue: "F")
if fahrenheitUnit != nil {
print("This is a defined temperature unit, so initialization succeeded.")
}
// Prints "This is a defined temperature unit, so initialization succeeded."
let unknownUnit = TemperatureUnit(rawValue: "X")
if unknownUnit == nil {
print("This is not a defined temperature unit, so initialization failed.")
}
// Prints "This is not a defined temperature unit, so initialization failed."
๋์์ ์์ TempertureUnit ๊ณผ ๊ฐ๋ค. ํ์ง๋ง TempertureUnit์์์ ์์ฑ์ ๊ตฌํ์ด ํจ์ฌ ๊ฐ๋จํด์ก๋ค.
์์ ์ฝ๋๋ ์์ ๊ฐ์ ๊ฐ๋ TemperatureUnit ์ด๊ฑฐํ์ ์ ์ํ ๊ฒ์ด๋ค. ๋ฐ๋ก ์์ฑ์๋ฅผ ์ ์ํ์ง ์์์ง๋ง ์๋์ ์ผ๋ก init?(rawValue:)๊ฐ ์์ฑ๋์ด ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์์ฑ์ ์คํจ ์ ๋ฌ(์์)
ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ ๊ฐ์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์คํจ๊ฐ๋ฅํ ์์ฑ์์ ์์ํ ์ ์๋ค. ๋น์ทํ๊ฒ ์๋ธํด๋์ค์ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ ์ํผํด๋์ค์ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์์ํ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์ ์์ฑ์๊ฐ ์คํจํ๊ฒ ๋๋ฉด ์ ์ฒด ์์ฑ์ ํ๋ก์ธ์ค๊ฐ ์คํจํ๊ณ ๋ ์ด์ ์ฝ๋๊ฐ ์คํ๋์ง ์๋๋ค.
์คํจ๊ฐ๋ฅํ ์์ฑ์๋ ์คํจํ ์ ์๋ ์์ฑ์๋ฅผ ์์ํ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
class Product {
let name: String
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
class CartItem: Product {
let quantity: Int
init?(name: String, quantity: Int) {
if quantity < 1 { return nil }
self.quantity = quantity
super.init(name: name)
}
}
์ ์ฝ๋๋ Product ํด๋์ค์ ์ด๋ฅผ ์์๋ฐ๋ CartItem ํด๋์ค๋ฅผ ์ ์ํ ์ฝ๋์ด๋ค. ๋ ํด๋์ค์๋ ๋ชจ๋ ์คํจ๊ฐ๋ฅํ ์์ฑ์๊ฐ ์ ์๋์ด์๋ค. CartItemํด๋์ค์ ์์ฑ์๋ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ quantity์ ๊ฐ์ด 1๋ณด๋ค ์์ผ๋ฉด ์ด๊ธฐํ์ ์คํจํ๊ฒ ๋์ด ๋ ์ด์ ์ฝ๋๊ฐ ์คํ๋์ง ์๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Product ํด๋์ค์ ์์ฑ์๋ name์ ๋น ๋ฌธ์์ด์ด ์ ๋ ฅ๋๋ค๋ฉด ๋ชจ๋ ์ด๊ธฐํ ํ๋ก์ธ์ค๊ฐ ์คํจํ๊ฒ ๋๋ค.
if let twoSocks = CartItem(name: "sock", quantity: 2) {
print("Item: \\(twoSocks.name), quantity: \\(twoSocks.quantity)")
}
// Prints "Item: sock, quantity: 2"
์ ์ฝ๋๋ name๋ ์๊ณ , quantity๋ 1์ด์์ด๋ฏ๋ก ์ธ์คํด์ค ์์ฑ์ ์ฑ๊ณตํ๋ค.
if let zeroShirts = CartItem(name: "shirt", quantity: 0) {
print("Item: \\(zeroShirts.name), quantity: \\(zeroShirts.quantity)")
} else {
print("Unable to initialize zero shirts")
}
// Prints "Unable to initialize zero shirts"
์ ์ฝ๋๋ ์ธ์คํด์ค ์์ฑ์ quantity๊ฐ 0์ด๋ฏ๋ก ์ธ์คํด์ค ์ด๊ธฐํ์ ์คํจํ๋ค.
if let oneUnnamed = CartItem(name: "", quantity: 1) {
print("Item: \\(oneUnnamed.name), quantity: \\(oneUnnamed.quantity)")
} else {
print("Unable to initialize one unnamed product")
}
// Prints "Unable to initialize one unnamed product"
์ ์ฝ๋๋ quantity๋ 1 ์ด์์ด์ง๋ง, name์ด ๋น์ด์๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ์ ์คํจํ๋ค.
Failable ์์ฑ์์ ์ค๋ฒ๋ผ์ด๋ฉ
์ํผํด๋์ค์ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์๋ธํด๋์ค์์ ์คํจ๋ถ๊ฐ๋ฅํ ์์ฑ์๋ก ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ ์ด์ฉํด ์คํจ๋ถ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์์ฑ ๊ฐ๋ฅํ๋ค.
์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์คํจ๋ถ๊ฐ๋ฅํ ์์ฑ์์์ ์ค๋ฒ๋ผ์ด๋ ํ ์ ์์ง๋ง, ๊ทธ ๋ฐ๋๋ ๋ถ๊ฐ๋ฅ ํ๋ค.
์๋ Document ํด๋์ค๋ ์ด๊ธฐํ๋ฅผ ํ ๋, name ๊ฐ์ผ๋ก ํน์ String์ ์ง์ ํ๊ฑฐ๋ nil์ ์ง์ ํ ์ ์๋ค. ํ์ง๋ง name์ด ๋น์ด์๋ ๊ฒฝ์ฐ์๋ ์ด๊ธฐํ ์คํจ๋ฅผ ๋ํ๋ด๋ nil์ ๋ฐํํ๋ค.
class Document {
var name: String?
// this initializer creates a document with a nil name value
init() {}
// this initializer creates a document with a nonempty name value
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
Document๋ฅผ ์๋ธํด๋์ฑํ AutomaticNamedDocument ํด๋์ค์์๋ ๊ธฐ๋ณธ ์์ฑ์์ ์ง์ ์์ฑ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์คํจ๋ถ๊ฐ๋ฅํ ์์ฑ์๋ก ๋ง๋ค์๋ค. ์ด๊ธฐ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ name์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก **[Untitled]**๋ฅผ ๋ฃ๋๋ก ํ๋ค.
class AutomaticallyNamedDocument: Document {
override init() {
super.init()
self.name = "[Untitled]"
}
override init(name: String) {
super.init()
if name.isEmpty {
self.name = "[Untitled]"
} else {
self.name = name
}
}
}
Document๋ฅผ ์๋ธํด๋์ฑํ ๋ ๋ค๋ฅธ ํด๋์ค UntitledDocument ์์๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ ์์ฑ์๋ฅผ ๊ตฌํํ๊ณ , ๊ทธ ๊ฐ์ด ์ต์ ๋ ๊ฐ์ ๊ฐ์ง ์๋๋ก ๋๋ํ(!)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ธ๋ํ ํด์ฃผ์๋ค. super.init(name: “[Untitled]”)!
class UntitledDocument: Document {
override init() {
super.init(name: "[Untitled]")!
}
}
Failable init! ์์ฑ์
์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ init? ํค์๋๋ก ๋ง๋ค์ง๋ง, ์ต์ ๋ ํ์ ์ด ์๋ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์คํจ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด init! ์ ์ฌ์ฉํ๋ฉด ๋๋ค. init!์์ฑ์๋ฅผ ์์ํ ๋๋ init! ์์ฑ์๋ก ์ธํด ์คํจํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผํ๋ค.
ํ์ ์์ฑ์ (Required Initializers)
๋ชจ๋ ์๋ธํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ์์ฑ์๋ ์๋ ์์ ์ ๊ฐ์ด required ํค์๋๋ฅผ ๋ถ์ฌ์ค๋ค.
class SomeClass {
required init() {
// initializer implementation goes here
}
}
ํ์ ์์ฑ์๋ ์์๋ฐ์ ์๋ธํด๋์ค์์๋ ๋ฐ๋์ required ํค์๋๋ฅผ ๋ถ์ฌ์ ๋ค๋ฅธ ์๋ธํด๋์ค์๊ฒ๋ ํ์ ์์ฑ์์์ ๋ช ํํ๊ฒ ์๋ ค์ผํ๋ค.
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
}()
}
someProperty๋ ํด๋ก์ ๊ฐ ์คํ๋ ์ดํ ๋ฐํ ํ์ ์ด SomeType์ธ SomeValue๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ๊ฒ ๋๋ค.
ํด๋ก์ ๋ฅผ ์ด๊ธฐ์์์ ์ฌ์ฉํ๋ฉด ํด๋ก์ ์์ self๋ ๋ค๋ฅธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ ์ด์ ๋ ํด๋ก์ ๊ฐ ์คํ๋ ์์ ์ ๋ค๋ฅธ ํ๋กํผํฐ๋ ์ด๊ธฐํ๊ฐ ๋ค ๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
struct Chessboard {
let boardColors: [Bool] = {
var temporaryBoard = [Bool]()
var isBlack = false
for i in 1...8 {
for j in 1...8 {
temporaryBoard.append(isBlack)
isBlack = !isBlack
}
isBlack = !isBlack
}
return temporaryBoard
}()
func squareIsBlackAt(row: Int, column: Int) -> Bool {
return boardColors[(row * 8) + column]
}
}
Chessboard์์ boardColors ํด๋ก์ ๋ฅผ ์ด์ฉํด 8x8 ๋ณด๋ ์์ ๊ฐ๋ Bool ๋ฐฐ์ด๋ก ์ด๊ธฐํ ๋๋ค. ๋ณด๋์ด ํน์ ํ-์ด์ด ์ด๋ค ์์ธ์ง ํ์ธํ๋ ํจ์ squarelsBlackAt(row: Int, column: Int)๊ฐ ์ ๊ณต๋๋ค.
let board = Chessboard()
print(board.squareIsBlackAt(row: 0, column: 1))
// Prints "true"
print(board.squareIsBlackAt(row: 7, column: 7))
// Prints "false"
Chessboard() ์ํ์ผ๋ก 8x8 ๋ณด๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋์๋ค. ์์ฑ๋ ๋ณด๋์์ ํน์ ํ-์ด์ด ์ด๋ค ์์ธ์ง ์์๋ณด๊ธฐ ์ํด squareIsBlackAt(row: Int, column: Int) ํจ์๋ฅผ ํธ์ถํ๋ค.