μλ νμΈμ. μ€λμ Swift 'μμ(Inheritance)'μ λν΄ μμλ³΄κ² μ΅λλ€. κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μ€μν νΉμ±μΈ μμμ΄ Swiftμμλ μ΄λ»κ² ꡬνλλμ§, λ€μν μμ μ ν¨κ» μ΄ν΄λ³΄κ² μ΅λλ€.
π μμμ΄λ? (Inheritance)
μμμ ν ν΄λμ€κ° λ€λ₯Έ ν΄λμ€μ λ©μλ, νλ‘νΌν°, κ·Έλ¦¬κ³ λ€λ₯Έ νΉμ±μ λ¬Όλ €λ°λ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ μ λλ€. Swiftμμ μμμ ν΄λμ€μμλ§ κ°λ₯ν νΉλ³ν κΈ°λ₯μΌλ‘, μμμ λ°λ ν΄λμ€λ₯Ό νμ ν΄λμ€(subclass), μμμ μ 곡νλ ν΄λμ€λ₯Ό μμ ν΄λμ€(superclass)λΌκ³ ν©λλ€.
μμ(Inheritance): κΈ°μ‘΄ ν΄λμ€μ νΉμ±(νλ‘νΌν°, λ©μλ λ±)μ μ ν΄λμ€κ° λ¬Όλ €λ°λ κ²
νμ ν΄λμ€(Subclass): λ€λ₯Έ ν΄λμ€μμ μμλ°λ ν΄λμ€
μμ ν΄λμ€(Superclass): λ€λ₯Έ ν΄λμ€μκ² νΉμ±μ λ¬Όλ €μ£Όλ ν΄λμ€
π κΈ°λ³Έ ν΄λμ€ μ μ (Base Class)
μμ κ΄κ³μ μμμ μ΄ λλ ν΄λμ€λ₯Ό **κΈ°λ³Έ ν΄λμ€(Base Class)**λΌκ³ ν©λλ€. Swiftμμλ λ€λ₯Έ μΈμ΄λ€κ³Ό λ¬λ¦¬ λͺ¨λ ν΄λμ€κ° μλμΌλ‘ μμνλ λ²μ© κΈ°λ³Έ ν΄λμ€κ° μμ΅λλ€.
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// κΈ°λ³Έ ꡬνμ μ무κ²λ νμ§ μμ
}
}
let someVehicle = Vehicle()
print("Vehicle: \(someVehicle.description)")
// μΆλ ₯: "Vehicle: traveling at 0.0 miles per hour"
κΈ°λ³Έ ν΄λμ€(Base Class): λ€λ₯Έ ν΄λμ€λ‘λΆν° μμλ°μ§ μμ ν΄λμ€
μ μ₯ νλ‘νΌν°(Stored Property): μΈμ€ν΄μ€μ μΌλΆλ‘ κ°μ μ μ₯νλ νλ‘νΌν°(μ: currentSpeed)
κ³μ° νλ‘νΌν°(Computed Property): κ°μ μ μ₯νμ§ μκ³ κ³μ°νμ¬ μ 곡νλ νλ‘νΌν°(μ: description)
π νμ ν΄λμ€ λ§λ€κΈ° (Subclassing)
νμ ν΄λμ€λ μμ ν΄λμ€μ λͺ¨λ νΉμ±μ μμλ°κ³ , μΆκ°λ‘ μλ‘μ΄ νΉμ±μ μ μν μ μμ΅λλ€. νμ ν΄λμ€λ₯Ό μ μν λλ ν΄λμ€ μ΄λ¦ λ€μ μ½λ‘ (:)μ λΆμ΄κ³ μμ ν΄λμ€ μ΄λ¦μ λͺ μν©λλ€.
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true // Bicycleμ μ νλ‘νΌν°
bicycle.currentSpeed = 15.0 // Vehicleμμ μμλ°μ νλ‘νΌν°
print("Bicycle: \(bicycle.description)")
// μΆλ ₯: "Bicycle: traveling at 15.0 miles per hour"
νμ ν΄λμ€λ λ λ€λ₯Έ νμ ν΄λμ€μ μμ ν΄λμ€κ° λ μ μμ΅λλ€.
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.hasBasket = true // Bicycleμμ μμ
tandem.currentNumberOfPassengers = 2 // Tandemμ μ νλ‘νΌν°
tandem.currentSpeed = 22.0 // Vehicleμμ μμ
print("Tandem: \(tandem.description)")
// μΆλ ₯: "Tandem: traveling at 22.0 miles per hour"
νμ ν΄λμ€ν(Subclassing): κΈ°μ‘΄ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ μ ν΄λμ€λ₯Ό λ§λλ κ³Όμ
μμ κ³μΈ΅(Inheritance Hierarchy): μ¬λ¬ λ¨κ³μ μμμΌλ‘ νμ±λ ν΄λμ€λ€μ κ΄κ³
π μ¬μ μ (Overriding)
νμ ν΄λμ€λ μμ ν΄λμ€λ‘λΆν° μμλ°μ νΉμ±(λ©μλ, νλ‘νΌν°, μλΈμ€ν¬λ¦½νΈ)μ μμ λ§μ ꡬνμΌλ‘ λ체ν μ μμ΅λλ€. μ΄λ₯Ό **μ¬μ μ(Overriding)**λΌκ³ ν©λλ€.
Swiftμμ μ¬μ μλ₯Ό ν λλ νμ override ν€μλλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. μ΄λ μλμ μΈ μ¬μ μμμ λͺ νν νκ³ , μ€μλ‘ μ¬μ μνλ κ²μ λ°©μ§ν©λλ€.
λ©μλ μ¬μ μ (Overriding Methods)
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
// μΆλ ₯: "Choo Choo"
override ν€μλ: μμ ν΄λμ€μ νΉμ±μ μ¬μ μν¨μ λͺ μμ μΌλ‘ νμνλ ν€μλ
νλ‘νΌν° μ¬μ μ (Overriding Properties)
μμλ°μ νλ‘νΌν°λ₯Ό μ¬μ μν λλ getterμ setterλ₯Ό λͺ¨λ μ 곡νκ±°λ, νλ‘νΌν° κ΄μ°°μλ₯Ό μΆκ°ν μ μμ΅λλ€.
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// μΆλ ₯: "Car: traveling at 25.0 miles per hour in gear 3"
super: μμ ν΄λμ€μ λ©μλ, νλ‘νΌν°, μλΈμ€ν¬λ¦½νΈμ μ κ·Όν λ μ¬μ©νλ ν€μλ
getter/setter μ¬μ μ: μμ ν΄λμ€μμ μ μλ νλ‘νΌν°μ μ½κΈ°/μ°κΈ° λμμ λ³κ²½νλ κ²
νλ‘νΌν° κ΄μ°°μ μ¬μ μ (Overriding Property Observers)
μμλ°μ νλ‘νΌν°μ νλ‘νΌν° κ΄μ°°μλ₯Ό μΆκ°νμ¬ κ°μ΄ λ³κ²½λ λ νΉμ λμμ μνν μ μμ΅λλ€.
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// μΆλ ₯: "AutomaticCar: traveling at 35.0 miles per hour in gear 4"
νλ‘νΌν° κ΄μ°°μ(Property Observer): νλ‘νΌν° κ°μ λ³νλ₯Ό κ°μ§νμ¬ νΉμ μ‘μ μ μ€ννλ λ©μ»€λμ¦
didSet: νλ‘νΌν° κ°μ΄ λ³κ²½λ μ§νμ νΈμΆλλ κ΄μ°°μ
willSet: νλ‘νΌν° κ°μ΄ λ³κ²½λκΈ° μ§μ μ νΈμΆλλ κ΄μ°°μ
νλ‘νΌν° κ΄μ°°μ μ¬μ© μ μ£Όμμ¬ν:
- μμ μ μ₯ νλ‘νΌν°λ μ½κΈ° μ μ© κ³μ° νλ‘νΌν°μλ κ΄μ°°μλ₯Ό μΆκ°ν μ μμ΅λλ€.
- κ°μ νλ‘νΌν°μ λν΄ setterμ νλ‘νΌν° κ΄μ°°μλ₯Ό λμμ μ¬μ μν μ μμ΅λλ€.
π μ¬μ μ λ°©μ§ (Preventing Overrides)
νΉμ λ©μλ, νλ‘νΌν°, μλΈμ€ν¬λ¦½νΈκ° νμ ν΄λμ€μμ μ¬μ μλλ κ²μ λ°©μ§νκ³ μΆλ€λ©΄ final ν€μλλ₯Ό μ¬μ©ν©λλ€.
class Vehicle {
final var maximumSpeed = 150.0
final func stop() {
currentSpeed = 0.0
}
}
ν΄λμ€ μ체λ₯Ό μμμ΄ λΆκ°λ₯νκ² λ§λ€κ³ μΆλ€λ©΄, ν΄λμ€ μ μΈ μμ final ν€μλλ₯Ό λΆμ λλ€.
final class SportsCar {
// μ΄ ν΄λμ€λ μμλ μ μμ
}
final ν€μλ: ν΄λμ€, λ©μλ, νλ‘νΌν°, μλΈμ€ν¬λ¦½νΈκ° νμ ν΄λμ€μμ μ¬μ μλλ κ²μ λ°©μ§νλ ν€μλ
π μμμ νμ©κ³Ό μ₯μ
μμμ μ½λ μ¬μ¬μ©μ±μ λμ΄κ³ κ³μΈ΅μ ꡬ쑰λ₯Ό λ§λ€μ΄ κ΄λ ¨ νμ λ€ μ¬μ΄μ κ΄κ³λ₯Ό λͺ ννκ² ννν μ μκ² ν΄μ€λλ€. νμ§λ§ κ³Όλν μμμ μ½λλ₯Ό 볡μ‘νκ² λ§λ€ μ μμΌλ―λ‘, νμν κ²½μ°μλ§ μ μ ν μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
μμμ μ¬μ©νκΈ° μ’μ κ²½μ°:
- is-a κ΄κ³κ° μ±λ¦½ν λ (μ: μμ κ±°λ νκ²μ΄λ€)
- κ³΅ν΅ κΈ°λ₯μ μ¬λ¬ ν΄λμ€κ° 곡μ ν λ
- λͺ νν κ³μΈ΅ κ΅¬μ‘°κ° νμν λ
μμλ³΄λ€ ν©μ±(Composition)μ κ³ λ €ν΄μΌ ν κ²½μ°:
- has-a κ΄κ³κ° μ±λ¦½ν λ (μ: μμ κ±°λ λ°κ΅¬λλ₯Ό κ°μ§κ³ μλ€)
- μ μ°ν κΈ°λ₯ μ‘°ν©μ΄ νμν λ
- λ¨μΌ μμμ μ νμ 극볡ν΄μΌ ν λ
π μ 리
- Swiftμ μμ λ©μ»€λμ¦μ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ μμΉμ λ°μνλ©΄μλ νμ μμ μ±μ μ μ§νλ λ°©μμΌλ‘ ꡬνλμ΄ μμ΅λλ€.
- overrideμ final κ°μ ν€μλλ₯Ό ν΅ν΄ μλλ₯Ό λͺ νν νννκ³ μ€μλ₯Ό λ°©μ§ν μ μμΌλ©°, μμ ν΄λμ€μ κΈ°λ₯μ νμ₯νκ±°λ μμ νλ μ μ°ν λ°©λ²μ μ 곡ν©λλ€.
'π₯ Bread Basics > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Swift 곡μ λ¬Έμ μ 리 - μλ¬ μ²λ¦¬ (Error Handling) (0) | 2025.04.11 |
---|---|
Swift 곡μ λ¬Έμ μ 리 - μ΅μ λ 체μ΄λ (Optional Chaining) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μ΄κΈ°ν ν΄μ (Deinitialization) (1) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μ΄κΈ°ν (Initialization) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μλΈ μ€ν¬λ¦½νΈ (Subscripts) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λ©μλ (Methods) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - νλ‘νΌν° (Properties) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - ꡬ쑰체μ ν΄λμ€ (Structures and Classes) (0) | 2025.04.11 |