μλ νμΈμ, κ°μμ λλ€. μ€λμ μ€μννΈ μμ(Inheritance)μ λν΄μ 곡λΆνμ΅λλ€. μ€λ²λΌμ΄λ λΌκ³ μ λ§ μ€μν κ°λ μ€ νλμΈλ°μ, μκ°λ³΄λ€ κ°λ μ κ°λ¨ν©λλ€.
Swift Document chap.13 Inheritance λ°λ‘κ°κΈ°
Inheritance (μμ)
ν΄λμ€λ λ€λ₯Έ ν΄λμ€λ‘λΆν° μμ ν (λ°μ) μ μλ€. μ΄κ²μ΄ ν΄λμ€κ° λ€λ₯Έ νμ λ€κ³Ό ꡬλΆλλ κ·Όλ³Έμ μΈ μμμ΄λ€. λ¨, νλμ ν΄λμ€λ§ μμ ν (λ°μ)μ μλ€.
Swift ν΄λμ€λ μνΌν΄λμ€μ μν λ©μλ, νλ‘νΌν° λ° νμ μ€ν¬λ¦½νΈλ₯Ό νΈμΆνκ³ μ κ·Όν μ μμΌλ©°, ν΄λΉ λ©μλ, νλ‘νΌν° λ° μ€ν¬λ¦½νΈμ overrideν λ²μ μ μ 곡νμ¬ ν΄λΉ λμμ μμ νκ±°λ λ―ΈμΈ μ‘°μ ν μ μλ€.
Swiftλ overrideμ μμ μΌμΉνλ μνΌν΄λμ€ μ μκ° μλμ§ νμΈνμ¬ override κ° μ¬λ°λ₯Έμ§ νμΈνλλ° λμμ΄ λλ€.
λν ν΄λμ€λ νλ‘νΌν° μ΅μ λ²λ₯Ό μμλ νλ‘νΌν°μ μΆκ°νμ¬ νλ‘νΌν° κ°μ΄ λ³κ²½λ λ μλ¦Όμ λ°κ³ , λͺ¨λν°λ§ ν μ μλ€. νλ‘νΌν° μ΅μ λ²λ μ μ₯/κ³μ° νλ‘νΌν°μ μκ΄μμ΄ λͺ¨λ νλ‘νΌν°μ μΆκ°ν μ μλ€.
Defining a Base Class (κΈ°λ³Έ ν΄λμ€)
λ€λ₯Έ μ΄λ€ ν΄λμ€λ‘λΆν°λ μμλ°μ§ μλ ν΄λμ€λ₯Ό “κΈ°λ³Έν΄λμ€ (base class)” λΌκ³ νλ€.
Swift ν΄λμ€λ 보νΈμ μΈ κΈ°λ³Έν΄λμ€μμ μμνμ§ μλλ€. μνΌν΄λμ€λ₯Ό μ§μ νμ§ μκ³ μ μνλ ν΄λμ€λ μλμΌλ‘ κΈ°λ³Έν΄λμ€κ° λμ΄μ extension(νμ₯) ν μ μλ€.
class Vehicle {
}
μμ Vehicle μ΄λΌλ ν΄λμ€λ μ무κ²λ μμλ°μ§ μκ³ μλ€. μ΄λ¬λ©΄ Vehicleμ κΈ°λ³Έ ν΄λμ€κ° λλ κ²μ΄λ€.
νλ‘νΌν°μ λ©μλλ₯Ό μΆκ°ν΄λ³΄μ.
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \\(currentSpeed) miles per hour"
}
func makeNoise() {
// do nothing - an arbitrary vehicle doesn't necessarily make a noise
}
}
let someVehicle = Vehicle()
print("Vehicle: \\(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour
β· μ½λμ€λͺ
- Vehicleμ΄λΌλ κΈ°λ³Έ ν΄λμ€λ₯Ό νλ μ μν κ²
- currentSpeed νμ¬μλλ₯Ό νλΌλ―Έν°λ‘ κ°κ³
- description μ μ°μ°νλ‘νΌν°λ₯Ό κ°μ
- makeNoise() λΌλ λ©μλ κ°μ§
- μ΄ ν΄λμ€λ₯Ό μ΄μ©ν΄μ vehicle κ°μ²΄λ₯Ό νλ μμ±νκ³ discriptionνλ‘νΌν°λ₯Ό νμ©νμ¬ νκ²μ νμ¬ μνλ₯Ό νμΈ
Subclassing (μλΈν΄λμ±)
μλΈν΄λμ±μ νλ©΄ λΆλͺ¨λ‘λΆν° μ±κ²©μ μμλ°κ³ μκΈ°μμ κ³ μ μ νΉμ±λ μΆκ°ν μ μλ€. μλΈν΄λμ±μ μ ν΄λμ€λ₯Ό μΈμΈνλ μ½λλ μλμ κ°λ€.
class SomeSubclass: SomeSuperclass {
// subclass definition goes here
}
μ μ½λμμ SomeSubclassλ μλΈν΄λμ€μ΄κ³ , : λ€μ SomeSuperclassλ μνΌν΄λμ€μ΄λ€.
κ·ΈλΌ μμμ Vehicleμ΄λΌλ ν΄λμ€λ₯Ό λ§λ€μμΌλ, μ΄ Vehicleμ μμνλ μλΈν΄λμ€λ₯Ό νλ λ§λ€μ΄λ³΄μ.
class Bicycle: Vehicle {
var hasBasket = false
}
- Bicycleμ Vehicle μ μλΈν΄λμ±νκ³ , μκΈ° μμ μ μμ±μΈ hasBasketμ μΆκ°νλ€.
- μ΄ Bicycle ν΄λμ€λ Vehicleμ νλ‘νΌν°μ λ©μλλ€μ μμν μ μμ λΏλ§ μλλΌ, μλ‘μ΄ νΉμ±κΉμ§λ μΆκ°ν μ μλ€. κ·Έλμ Bicycleν΄λμ€λ currentSpeed λ° descriptionμμ±κ³Ό makeNoise() λ©μλμ κ°μ λͺ¨λ νΉμ±μ μλμΌλ‘ μ»λλ€.
let bicycle = Bicycle()
bicycle.hasBasket = true
Bicycle κ°μ²΄λ₯Ό μμ±νμ¬ κ³ μ μμ±μ μ¬μ©ν μ μλ κ²μ νμΈν μ μλ€.
bicycle.currentSpeed = 15.0
print("Bicycle: \\(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour
Bicycle κ°μ²΄λ₯Ό μμ±ν΄ κ³ μ μμ±μ μ¬μ©ν μ μλ κ²μ νμΈν μ μλ€.
μλΈν΄λμ€λ‘ μμ±λ ν΄λμ€λ₯Ό λ€μ μλΈν΄λμ±νλ κ²λ κ°λ₯νλ€.
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
Bicycleμ μλΈν΄λμ±ν΄μ Tandemμ΄λΌλ ν΄λμ€λ₯Ό μμ±νκ³ μμ±λ μΆκ°ν΄λ³΄μ.
let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
print("Tandem: \\(tandem.description)")
// Tandem: traveling at 22.0 miles per hour
Tandemμ Tandem κ°μ²΄ κ³ μ μμ±μΈ currentNumberOfPassengers μ μμ μ λΆλͺ¨ Bicycleμ μμ±, κ·Έλ¦¬κ³ μ‘°λΆλͺ¨μΈ Vehicleμ μμ±λ λͺ¨λ μλμΌλ‘ μ»λλ€.
Overriding (μ€λ²λΌμ΄λ©, μ¬μ μ)
μλΈν΄λμ€μμλ λΆλͺ¨ν΄λμ€μμ μμλ°μ κ²μ μ¬μ μν μ μλ€. μ€λ²λΌμ΄λ©μ μΈμ€ν΄μ€ λ©μλ, νμ λ©μλ, μΈμ€ν΄μ€ νλ‘νΌν°, νμ νλ‘νΌν°, μ€ν¬λ¦½νΈ λͺ¨λμ λν΄ κ°λ₯νλ€.
μ€λ²λΌμ΄λλ₯Ό μν΄μλ μ μΈ μμ override ν€μλλ₯Ό μμ±ν΄μ£Όλ©΄ λλ€. Swiftμμλ override ν€μλλ₯Ό 보면 μ¬μ μλ₯Ό μν΄ μ 곡ν κ²κ³Ό μΌμΉνλ μ μΈμ μνΌν΄λμ€, μνΌν΄λμ€μ μνΌν΄λμ€ λ±μ μ μΈνλμ§ νμΈνλλ‘ μμ²νλ€. μ΄ κ²μ¬λ override μ μκ° μ¬λ°λ₯Έμ§ νμΈνλ€.
Accessing Superclass Methods, Properties and Subscripts
super ν€μλμ μ λ¬Έλ² νΉμ μΈλ±μ€ ꡬ문μΌλ‘ λΆλͺ¨ν΄λμ€μ λ©μλ, νλ‘νΌν°, μλΈν΄λμ€μ μ κ·Όν μ μλ€.
Overriding Methods (λ©μλ μ€λ²λΌμ΄λ©)
- μ€λ²λΌμ΄λ© λμμ΄ λλ λ©μλμ 맀κ°λ³μ κ°μλ νμ , κ·Έλ¦¬κ³ λ°ννμ μ λ³κ²½ν μ μλ€.
- λ©μλ μ€λ²λΌμ΄λ©μ ν΅ν΄ λ³κ²½ν μ μλ κ²μ μ€λ‘μ§ λ΄λΆ ꡬ문 λΏμ΄λ€.
μλ μ½λλ κΈ°μ‘΄ Vehicle ν΄λμ€λ₯Ό μμλ°μ λ§λ€μ΄μ§ Train ν΄λμ€μ΄λ€. λΆλͺ¨ ν΄λμ€μ κΈ°μ‘΄ λ©μλμΈ makeNoise() λ©μλλ₯Ό overrideνλ€.
overrideλ λ€μ μ μνλ κ²μ΄κΈ° λλ¬Έμ μ΄λ¦μ΄ 무쑰건 κ°μμΌνλ€. κ·Έλ¦¬κ³ override ν€μλλ₯Ό λΆμ΄λ©΄ λλ€.
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
// Prints "Choo Choo" : μλ‘ μ μν λ΄μ©μ΄ μΆλ ₯λ©λλ€.
μ΄λ κ² νκ² λλ©΄ κΈ°μ‘΄ λ©μλλ μλμ²λΌ μ¬μ© κ°λ₯νλ€. (super ν€μλ)
class Train: Vehicle {
override func makeNoise() {
super.makeNoise()
}
}
Overriding Properties (νλ‘νΌν° μ€λ²λΌμ΄λ©)
- μ μ₯ νλ‘νΌν°, μ°μ° νλ‘νΌν° λͺ¨λ μ€λ²λΌμ΄λ κ°λ₯
- μ μ₯ νλ‘νΌν°λ₯Ό μ€λ²λΌμ΄λ© ν λλ κ³μ° νλ‘νΌν°κ° λλ€. (μμλ°μ μ½κΈ°μ μ© νλ‘νΌν°λ getter/setter λ₯Ό μ μν΄μ μ½κ³ /μ°κΈ° κ° κ°λ₯ν νλ‘νΌν°λ‘ λ³κ²½ν΄μ μ 곡νκΈ° λλ¬Έ)
- νλ‘νΌν°μ μ€λ²λΌμ΄λ©μ μμ ν΄λμ€μ κΈ°λ₯μ νμν΄λμ€κ° νμ₯, λλ λ³κ²½νλ ννλ‘λ§ μ§νλμ΄μΌ νλ€.
- λ§μ½ setterλ₯Ό μ€λ²λΌμ΄λν΄μ μ 곡νλ€λ©΄ λ°λμ getterλ μ 곡ν΄μΌ νλ€.
κ³μ° νλ‘νΌν°μ μμλ₯Ό μ΄ν΄λ³΄μ.
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
μΆλ ₯μ ν΄λ³΄λ©΄, μ¬μ μ λ μνλ‘ μΆλ ₯λλ κ²μ νμΈν μ μλ€.
Overriding Property Observers (νλ‘νΌν° μ΅μ λ² μ€λ²λΌμ΄λ©)
- νλ‘νΌν° μ€λ²λΌμ΄λ©μ νμ©νμ¬ μμλ νλ‘νΌν°μ νλ‘νΌν° μ΅μ λ²λ₯Ό μΆκ°ν μ μμ.
- μμλ νλ‘νΌν°μ κ°μ΄ λ³κ²½λ λ, ν΄λΉ νλ‘νΌν°κ° μ²μ ꡬνλ κ²κ³Ό μκ΄ μμ΄ μλ¦Όμ λ°μ μ μλ€.
- μμλ μμ μ μ₯ νλ‘νΌν° λλ μ½κΈ°μ μ© κ³μ° νλ‘νΌν°μλ νλ‘νΌν° μ΅μ λ²λ₯Ό μΆκ°ν μ μλ€.
- λμΌν νλ‘νΌν°μ λν΄ override setterμ override νλ‘νΌν° μ΅μ λ²λ₯Ό λ λ€ μ 곡ν μλ μλ€.
μ΅μ λ² μ€λ²λΌμ΄λ© μμ μ½λλ₯Ό μ΄ν΄λ³΄μ.
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
currentSpeed κ³μ° νλ‘νΌν°λ₯Ό μ€λ²λΌμ΄λ νλ€.
μ½λ μ€νκ²°κ³Ό μ€λ²λΌμ΄λ ν λ΄μ©μ΄ μΆλ ₯λλ κ²μ λ³Ό μ μλ€.
Preventing Overrides (μ€λ²λΌμ΄λ© λ°©μ§νκΈ° final)
- μ€λ²λΌμ΄λλ₯Ό μμΉ μμ κ²½μ° μ¬μ©νλ€.
(μλΈν΄λμ€μμ νΉμ λ©μλ, νλ‘νΌν°, μλΈμ€ν¬λ¦½νΈκ° μ€λ²λΌμ΄λ λλ κ²μ λ°©μ§νκΈ° μν΄ μ¬μ©) - final ν€μλλ₯Ό λΆμΈλ€.
- ν΄λμ€ μ 체λ₯Ό finalλ‘ μ μΈν΄μ ν΄λμ€ μμ λͺ¨λ λ©μλ, νλ‘νΌν° λ±μ΄ override λλ κ²μ λ§μ μ μλ€.