์๋ ํ์ธ์. ์ค๋์ Swift '์ด๊ธฐํ(Initialization)'์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๊ธฐํ๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๋ก ์ค๋นํ๋ ๊ณผ์ ์ผ๋ก, Swift์ ํ์ ์์ ์ฑ๊ณผ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ํต์ฌ์ ๋๋ค.
๐ ์ด๊ธฐํ๋? (Initialization)
์ด๊ธฐํ๋ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์ ํ์ํ ์ค๋น ๊ณผ์ ์ ์ํํฉ๋๋ค. ์ด ๊ณผ์ ์์๋:
- ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ ์ค์
- ๊ธฐํ ์ค์ ๋ฐ ์ค๋น ์์ ์ํ
Swift์์๋ init ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํ ๊ตฌ๋ฌธ(initializer)์ ์ ์ํฉ๋๋ค:
struct Fahrenheit {
var temperature: Double
init() {
temperature = 32.0 // ๋ฌผ์ด ์ผ์ด๋ฒ๋ฆฌ๋ ํ์จ ์จ๋
}
}
var f = Fahrenheit()
print("๊ธฐ๋ณธ ์จ๋๋ \(f.temperature)° ํ์จ์
๋๋ค")
// ์ถ๋ ฅ: "๊ธฐ๋ณธ ์จ๋๋ 32.0° ํ์จ์
๋๋ค"
์ด๊ธฐํ ๊ตฌ๋ฌธ(Initializer): ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ํธ์ถ๋๋ ํน์ ๋ฉ์๋๋ก, ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ ์ ํ ์ด๊ธฐํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๐ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ ์ค์ ๋ฐฉ๋ฒ
Swift์์๋ ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค:
1. ๊ธฐ๋ณธ ํ๋กํผํฐ ๊ฐ ์ค์
ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๋ ์ง์ ์ด๊ธฐ๊ฐ์ ํ ๋นํฉ๋๋ค:
struct Fahrenheit {
var temperature = 32.0 // ์ ์ธ๊ณผ ๋์์ ๊ธฐ๋ณธ๊ฐ ์ค์
}
๊ธฐ๋ณธ ํ๋กํผํฐ ๊ฐ(Default Property Value): ํ๋กํผํฐ ์ ์ธ ์ ์ง์ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก, ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ณ ์ด๊ธฐํ ์๋๋ฅผ ๋ช ํํ๊ฒ ํฉ๋๋ค.
2. ์ด๊ธฐํ ๊ตฌ๋ฌธ ๋ด์์ ์ค์
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
์ฃผ์: ์ด๊ธฐํ ๊ตฌ๋ฌธ์์ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ์ค์ ํ ๋๋ ํ๋กํผํฐ ๊ด์ฐฐ์๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค.
๐ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์ปค์คํฐ๋ง์ด์ง
Swift๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ด๊ธฐํ ๊ณผ์ ์ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์ด๊ธฐํ ํ๋ผ๋ฏธํฐ (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
}
init(_ celsius: Double) { // ์ธ์ ๋ ์ด๋ธ ์๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ
temperatureInCelsius = celsius
}
}
let bodyTemp = Celsius(37.0) // ์ธ์ ๋ ์ด๋ธ ์์ด ํธ์ถ
let boilingPoint = Celsius(fromFahrenheit: 212.0) // ์ธ์ ๋ ์ด๋ธ๊ณผ ํจ๊ป ํธ์ถ
ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์ธ์ ๋ ์ด๋ธ: ํจ์๋ ๋ฉ์๋์ฒ๋ผ ์ด๊ธฐํ ๊ตฌ๋ฌธ๋ ๋ด๋ถ์์ ์ฌ์ฉํ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ํธ์ถ ์ ์ฌ์ฉํ ์ธ์ ๋ ์ด๋ธ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ธ๋์ค์ฝ์ด(_): ์ธ์ ๋ ์ด๋ธ์ ์๋ตํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
์ต์ ๋ ํ๋กํผํฐ ํ์
๊ฐ์ด ์์ ์๋ ์๋ ํ๋กํผํฐ๋ ์ต์ ๋ ํ์ ์ผ๋ก ์ ์ธํ ์ ์์ต๋๋ค:
class SurveyQuestion {
let text: String
var response: String? // ์ต์
๋ ๋ฌธ์์ด - ์ด๊ธฐ๊ฐ์ ์๋์ผ๋ก nil
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let question = SurveyQuestion(text: "์น์ฆ๋ฅผ ์ข์ํ๋์?")
question.ask() // "์น์ฆ๋ฅผ ์ข์ํ๋์?" ์ถ๋ ฅ
question.response = "๋ค, ์น์ฆ๋ฅผ ์ข์ํฉ๋๋ค."
์ต์ ๋ ํ๋กํผํฐ(Optional Property): ๊ฐ์ด ์์ ์๋ ์์์ ๋ํ๋ด๋ ํ๋กํผํฐ๋ก, ์ด๊ธฐํ ์ ์๋์ผ๋ก nil๋ก ์ค์ ๋ฉ๋๋ค.
์ด๊ธฐํ ์ค ์์ ํ๋กํผํฐ ํ ๋น
class SurveyQuestion {
let text: String // ์์ ํ๋กํผํฐ
var response: String?
init(text: String) {
self.text = text // ์ด๊ธฐํ ์ค์ ์์ ๊ฐ ์ค์
}
}
์์ ํ๋กํผํฐ(Constant Property): let์ผ๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ก, ์ด๊ธฐํ ๊ณผ์ ์์๋ ๊ฐ์ ํ ๋นํ ์ ์์ง๋ง ๊ทธ ์ดํ์๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๐ ๊ธฐ๋ณธ ์ด๊ธฐํ ๊ตฌ๋ฌธ๊ณผ ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ
Swift๋ ํน์ ์กฐ๊ฑด์์ ์๋์ผ๋ก ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค.
๊ธฐ๋ณธ ์ด๊ธฐํ ๊ตฌ๋ฌธ (Default Initializers)
๋ชจ๋ ํ๋กํผํฐ๊ฐ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง๊ณ ์๊ณ , ์ฌ์ฉ์ ์ ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ด ์๋ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ ์๋์ผ๋ก ๊ธฐ๋ณธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋ฐ์ต๋๋ค:
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem() // ๊ธฐ๋ณธ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์ฌ์ฉ
๊ธฐ๋ณธ ์ด๊ธฐํ ๊ตฌ๋ฌธ(Default Initializer): ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ ํ๋ผ๋ฏธํฐ ์๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋๋ค.
๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ (Memberwise Initializers)
์ฌ์ฉ์ ์ ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ด ์๋ ๊ตฌ์กฐ์ฒด๋ ์๋์ผ๋ก ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋ฐ์ต๋๋ค:
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0) // ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ
let zeroByTwo = Size(height: 2.0) // width๋ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ
let zeroByZero = Size() // ๋ชจ๋ ํ๋กํผํฐ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ
๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ(Memberwise Initializer): ๊ตฌ์กฐ์ฒด์ ๊ฐ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํํ ์ ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋๋ค.
๐ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์์ (Initializer Delegation)
์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋ค๋ฅธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํธ์ถํ์ฌ ์ผ๋ถ ์ด๊ธฐํ ์์ ์ ์์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ์ค๋ณต์ ๋ฐฉ์งํฉ๋๋ค.
๊ฐ ํ์ ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์์
๊ฐ ํ์ (๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ)์์๋ self.init์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์์ํฉ๋๋ค:
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) // ๋ค๋ฅธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์์
}
}
์ด๊ธฐํ ๊ตฌ๋ฌธ ์์(Initializer Delegation): ํ ์ด๊ธฐํ ๊ตฌ๋ฌธ์์ ๋ค๋ฅธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํธ์ถํ์ฌ ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๋ ๊ธฐ๋ฒ์ ๋๋ค.
ํด๋์ค์ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์์ ๊ท์น
ํด๋์ค๋ ์์์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ ๋ณต์กํ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์์ ๊ท์น์ ๊ฐ์ง๋๋ค:
- ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ(Designated Initializers):
- ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ
- ์์ ํด๋์ค์ ์ ์ ํ ์ด๊ธฐํ ๊ตฌ๋ฌธ ํธ์ถ
- ์ฃผ ์ด๊ธฐํ ๊ฒฝ๋ก๋ก ์๋
- ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ(Convenience Initializers):
- ๋์ผํ ํด๋์ค์ ๋ค๋ฅธ ์ด๊ธฐํ ๊ตฌ๋ฌธ ํธ์ถ
- ์ผ๋ฐ์ ์ธ ์ด๊ธฐํ ํจํด์ ๋ํ shortcut ์ ๊ณต
class Vehicle {
var numberOfWheels = 0
var description: String {
return "\(numberOfWheels) wheel(s)"
}
}
class Bicycle: Vehicle {
override init() {
super.init() // ์์ ํด๋์ค ์ด๊ธฐํ ๊ตฌ๋ฌธ ํธ์ถ
numberOfWheels = 2
}
}
์ด๊ธฐํ ๊ตฌ๋ฌธ ์์ ๊ท์น:
- ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋ฐ๋์ ์์ ํด๋์ค์ ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํธ์ถํด์ผ ํจ
- ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋ฐ๋์ ๊ฐ์ ํด๋์ค์ ๋ค๋ฅธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํธ์ถํด์ผ ํจ
- ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๊ถ๊ทน์ ์ผ๋ก ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํธ์ถํด์ผ ํจ
๊ฐ๋จํ ๊ธฐ์ตํ๋ ๋ฐฉ๋ฒ:
- ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํญ์ ์๋ก ์์ํฉ๋๋ค.
- ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํญ์ ์์ผ๋ก ์์ํฉ๋๋ค.
๐ ํด๋์ค ์์๊ณผ ์ด๊ธฐํ (2๋จ๊ณ ์ด๊ธฐํ)
Swift์ ํด๋์ค ์ด๊ธฐํ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด 2๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค:
1๋จ๊ณ
- ํด๋์ค์ ๋์ ๋ ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ ์ง์
- ์์ ํด๋์ค ์ฒด์ธ์ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋ฉฐ ๊ฐ ํด๋์ค๊ฐ ์์ ์ ํ๋กํผํฐ ์ด๊ธฐํ
- ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ๊ฐ ์ด๊ธฐ๊ฐ์ ๊ฐ์ง๋ฉด 1๋จ๊ณ ์๋ฃ
2๋จ๊ณ
- ์ต์์์์ ์ตํ์๋ก ๋ด๋ ค์ค๋ฉด์ ์ธ์คํด์ค๋ฅผ ์ถ๊ฐ๋ก ์ปค์คํฐ๋ง์ด์ง
- self๋ฅผ ์ฐธ์กฐํ๊ณ , ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ, ํ๋กํผํฐ ์์ ๋ฑ์ด ๊ฐ๋ฅ
class Food {
var name: String
init(name: String) {
self.name = name // 1๋จ๊ณ: ์์ ์ ํ๋กํผํฐ ์ด๊ธฐํ
}
}
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity // 1๋จ๊ณ: ์์ ์ ํ๋กํผํฐ ์ด๊ธฐํ
super.init(name: name) // 1๋จ๊ณ: ์์ ํด๋์ค ์ด๊ธฐํ ๊ตฌ๋ฌธ ํธ์ถ
}
override convenience init(name: String) {
self.init(name: name, quantity: 1) // ๋ค๋ฅธ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์์
}
}
2๋จ๊ณ ์ด๊ธฐํ(Two-Phase Initialization): Swift์ ํด๋์ค ์ด๊ธฐํ ์์ ์ฑ์ ๋ณด์ฅํ๋ ํ๋ก์ธ์ค๋ก, ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ด๊ธฐํ๋ ํ์๋ง self๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํฉ๋๋ค.
๐ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์์๊ณผ ์ฌ์ ์
์ด๊ธฐํ ๊ตฌ๋ฌธ ์ฌ์ ์
ํ์ ํด๋์ค๋ ์์ ํด๋์ค์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค:
class Vehicle {
var numberOfWheels = 0
init() {
// ๊ธฐ๋ณธ ์ด๊ธฐํ
}
}
class Bicycle: Vehicle {
override init() {
super.init() // ๋ฐ๋์ ์์ ํด๋์ค ์ด๊ธฐํ ๊ตฌ๋ฌธ ํธ์ถ
numberOfWheels = 2
}
}
override: ์์ ํด๋์ค์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ฌ์ ์ํ ๋ ์ฌ์ฉํ๋ ํค์๋์ ๋๋ค.
์๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์์
ํน์ ์กฐ๊ฑด์์๋ ํ์ ํด๋์ค๊ฐ ์์ ํด๋์ค์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์๋์ผ๋ก ์์๋ฐ์ ์ ์์ต๋๋ค:
- ํ์ ํด๋์ค๊ฐ ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ ์ํ์ง ์์ผ๋ฉด, ์์ ํด๋์ค์ ๋ชจ๋ ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์์
- ํ์ ํด๋์ค๊ฐ ์์ ํด๋์ค์ ๋ชจ๋ ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๊ตฌํํ๋ฉด, ์์ ํด๋์ค์ ๋ชจ๋ ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ๋ ์๋ ์์
class ShoppingListItem: RecipeIngredient {
var purchased = false // ๋ชจ๋ ์ ํ๋กํผํฐ์ ๊ธฐ๋ณธ๊ฐ ์ ๊ณต
// ์์ ํด๋์ค์ ๋ชจ๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์๋ ์์
}
๐ ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐํ ๊ตฌ๋ฌธ (Failable Initializers)
์ด๊ธฐํ๊ฐ ์คํจํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Swift๋ ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค:
struct Animal {
let species: String
init?(species: String) { // ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐํ ๊ตฌ๋ฌธ
if species.isEmpty { return nil }
self.species = species
}
}
let someCreature = Animal(species: "๊ธฐ๋ฆฐ") // Optional<Animal> ํ์
if let giraffe = someCreature {
print("๋๋ฌผ์ด \(giraffe.species) ์ข
์ผ๋ก ์ด๊ธฐํ๋์์ต๋๋ค")
}
let emptyAnimal = Animal(species: "") // nil ๋ฐํ
์คํจ ๊ฐ๋ฅํ ์ด๊ธฐํ ๊ตฌ๋ฌธ(Failable Initializer): init? ํํ๋ก ์ ์ธ๋๋ฉฐ, ์กฐ๊ฑด์ ๋ฐ๋ผ ์ด๊ธฐํ๋ฅผ ์คํจ์ํค๊ณ nil์ ๋ฐํํ ์ ์์ต๋๋ค.
์ด๊ฑฐํ์ ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐํ ๊ตฌ๋ฌธ
enum TemperatureUnit: Character {
case kelvin = "K", celsius = "C", fahrenheit = "F"
// ์์๊ฐ์ ๊ฐ์ง ์ด๊ฑฐํ์ ์๋์ผ๋ก init?(rawValue:)๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค
}
if let fahrenheitUnit = TemperatureUnit(rawValue: "F") {
print("ํ์จ ๋จ์๊ฐ ์ ์๋์ด ์์ต๋๋ค")
}
์ด๊ธฐํ ์คํจ ์ ํ
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) // ์์ ํด๋์ค ์ด๊ธฐํ๋ ์คํจ ๊ฐ๋ฅ
}
}
๐ ํ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ (Required Initializers)
๋ชจ๋ ํ์ ํด๋์ค๊ฐ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ง์ ํ ์ ์์ต๋๋ค:
class SomeClass {
required init() {
// ์ด๊ธฐํ ๊ตฌํ
}
}
class SomeSubclass: SomeClass {
required init() { // ๋ฐ๋์ ๊ตฌํํด์ผ ํจ
// ํ์ ํด๋์ค ๊ตฌํ
}
}
required: ํ์ ํด๋์ค๊ฐ ๋ฐ๋์ ํด๋น ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๊ตฌํํด์ผ ํจ์ ๋ํ๋ด๋ ํค์๋์ ๋๋ค.
๐ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ณธ ํ๋กํผํฐ ๊ฐ ์ค์
๋ณต์กํ ์ด๊ธฐํ ๋ก์ง์ด ํ์ํ ๊ฒฝ์ฐ, ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ํ๋กํผํฐ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค:
struct Chessboard {
let boardColors: [Bool] = {
var board = [Bool]()
var isBlack = false
for i in 1...8 {
for j in 1...8 {
board.append(isBlack)
isBlack = !isBlack
}
isBlack = !isBlack
}
return board
}() // ํด๋ก์ ๋ฅผ ์ฆ์ ์คํ
func squareIsBlackAt(row: Int, column: Int) -> Bool {
return boardColors[(row * 8) + column]
}
}
let board = Chessboard()
print(board.squareIsBlackAt(row: 0, column: 1)) // true
ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ํ๋กํผํฐ ์ด๊ธฐํ: ๋ณต์กํ ๊ณ์ฐ์ด ํ์ํ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ ๋ ์ ์ฉํฉ๋๋ค. ํด๋ก์ ๋ค์ ()๋ ํด๋ก์ ๋ฅผ ์ฆ์ ์คํํ๋ผ๋ ์๋ฏธ์ ๋๋ค.
๐ ์ ๋ฆฌ
Swift์ ์ด๊ธฐํ ์์คํ ์ ์์ ํ๊ณ ์ ์ฐํ ๊ฐ์ฒด ์์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ฃผ์ ํน์ง์ ์์ฝํ๋ฉด:
- ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ๋ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ ๊ฐ์ ธ์ผ ํจ
- ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํด๋์ค/๊ตฌ์กฐ์ฒด์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์์ ํ ์ด๊ธฐํํด์ผ ํจ
- ํด๋์ค๋ ์ง์ ์ด๊ธฐํ ๊ตฌ๋ฌธ๊ณผ ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํตํด ์ด๊ธฐํ ๊ณ์ธต์ ํ์ฑ
- 2๋จ๊ณ ์ด๊ธฐํ ํ๋ก์ธ์ค๋ ํด๋์ค ์ด๊ธฐํ์ ์์ ์ฑ ๋ณด์ฅ
- ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ด๊ธฐํ ์คํจ ์ฒ๋ฆฌ๋ฅผ ์ง์
- ํด๋ก์ ๋ ๋ณต์กํ ํ๋กํผํฐ ์ด๊ธฐํ์ ํ์ฉ ๊ฐ๋ฅ
Swift์ ์ด๊ธฐํ ์์คํ ์ ์ดํดํ๋ฉด ์์ ํ๊ณ ํจ์จ์ ์ธ ๊ฐ์ฒด ์์ฑ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ํนํ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ์์ ๋ฐ์ํ ์ ์๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์์ต๋๋ค.
'๐ฅ Bread Basics > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋์์ฑ (Concurrency) (0) | 2025.04.11 |
---|---|
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์๋ฌ ์ฒ๋ฆฌ (Error Handling) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ต์ ๋ ์ฒด์ด๋ (Optional Chaining) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ด๊ธฐํ ํด์ (Deinitialization) (1) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์์ (Inheritance) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์๋ธ ์คํฌ๋ฆฝํธ (Subscripts) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋ฉ์๋ (Methods) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ๋กํผํฐ (Properties) (0) | 2025.04.11 |