Β μμμ΄λ 'ν ν΄λμ€κ° λ€λ₯Έ ν΄λμ€μμ μ μλ νλ‘νΌν°λ λ©μλλ₯Ό λ¬Όλ €λ°μ μ¬μ©νλ κ²' μ΄λ€.
Β μμμ νλ©΄ μ΄λ―Έ λ§λ€μ΄μ§ λ€λ₯Έ ν΄λμ€μ κΈ°λ₯μ΄λ νλ‘νΌν°λ₯Ό μ§μ ꡬννμ§ μκ³ λ μ¬μ©ν μ μκ³ , μΆκ°λ‘ νμν κΈ°λ₯μ΄λ νλ‘νΌν°λ§ μ μνμ¬ μ¬μ©νλ©΄ λλ€.
- νλ‘νΌν°μ λ©μλλ₯Ό λ¬Όλ €μ€ ν΄λμ€ = λΆλͺ¨ν΄λμ€ = μμν΄λμ€ = μνΌν΄λμ€ = κΈ°λ³Έν΄λμ€
- νλ‘νΌν°μ λ©μλλ₯Ό λ¬Όλ € λ°μ ν΄λμ€ = μμν΄λμ€ = νμν΄λμ€ = μλΈν΄λμ€ = νμν΄λμ€
class A {
var name = "Class A"
var description: String {
return "This class name is \(self.name)"
}
func foo() {
print("\(self.name)'s method foo is called")
}
}
// ν΄λμ€ Aλ₯Ό μμλ°μ μλ‘μ΄ ν΄λμ€ μ μ: μλΈν΄λμ±μ΄λΌκ³ ν¨
class B: A {
var prop = "Class B"
func boo() -> String {
return "Class B prop = \(self.prop)"
}
}
let b =B()
b.prop // "Class B"
b.boo() // Class B prop = Class B
b.name // "Class A"
b.foo() // "Class A's method foo is called"
b.name = "Class C"
b.foo() // "Class C's method foo is called"
Β μ μ½λμμ ν΄λμ€ Bμλ λΆλͺ
name νλ‘νΌν°μ foo λ©μλκ° μ μλμ΄ μμ§ μμμλ λΆκ΅¬νκ³ , μΈμ€ν΄μ€ bλ μ΄λ€μ μ¬μ©νκ³ μλ€. μ΄λ ν΄λμ€ Bκ° Aλ₯Ό μμλ°μ λͺ¨λ νλ‘νΌν°μ λ©μλλ₯Ό λ¬Όλ €λ°μκΈ° λλ¬Έμ΄λ€.
Β μ€λ²λΌμ΄λ©μ΄λ μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€λ‘λΆν° μμλ°μ νλ‘νΌν°λ λ©μλλ₯Ό κ·Έλλ‘ μ¬μ©νμ§ μκ³ μ΄λ₯Ό λ€μ μ¬μ μνλ κ²μ΄λ€.
Β μ€λ²λΌμ΄λ©ν λ΄μ©μ μκΈ° μμ λλ μμ μ μλΈν΄λμ±ν νμ ν΄λμ€μλ§ μ μ©λλ€. μ¦ λΆλͺ¨ ν΄λμ€μκΉμ§λ μ μ©λμ§ μλλ€λ κ²μ΄λ€.
Β μ€μννΈμμλ μ€λ²λΌμ΄λ© νλ €λ λ©μλλ νλ‘νΌν°μ μ μΈ μμ override ν€μλλ₯Ό λΆμ¬μΌ νλ€. λ§μ½ μ€λ²λΌμ΄λ©μ΄ μλμλ overrideλ₯Ό λΆμ΄λ©΄ μ€λ₯κ° λ°μνλ€.
Β νλ‘νΌν°λ₯Ό μ€λ²λΌμ΄λ© ν λλ μμ ν΄λμ€μμ μ μ₯ νλ‘νΌν°μ건, μ°μ° νλ‘νΌν°μ건 κ΄κ³μμ΄ μ°μ° νλ‘νΌν°μ ννλ‘ μ€λ²λΌμ΄λ© ν΄μΌνλ€.
Β λν get, set ꡬ문μ λͺ¨λ μ 곡ν΄μΌ νλ€. μ μ₯ νλ‘νΌν°λ₯Ό μ½κΈ° μ μ© μ°μ° νλ‘νΌν°λ‘ μ€λ²λΌμ΄λ© ν μλ μλ€.
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "μκ°λΉ \(self.currentSpeed)μ μλλ‘ μ΄λνκ³ μλ€."
}
func makeNoise() {
// κ²½μ κ΄λ ¨ λ©μλ
}
}
class Car: Vehicle {
var gear = 0
var engineLevel = 0
override var currentSpeed: Double {
get {
return Double(self.engineLevel * 50)
}
set {
}
}
override var description: String {
get {
return "Car : engineLevel = \(self.engineLevel), so currentSpeed=\(self.currentSpeed)"
}
set {
print("New Value is \(newValue)")
}
}
}
let c = Car()
c.engineLevel = 5
c.currentSpeed // 250
c.description = "New Class Car"
print(c.desription)
//μ€ν κ²°κ³Ό
New Value is New Class Car
Car: engineLevel=5, so currentSpeed=250.0
Β μ μ½λμμ Vehicleμ΄λΌλ ν΄λμ€λ₯Ό Car ν΄λμ€μμ μμλ°κ³ μλ€. Vehicle ν΄λμ€μ μ μ₯ νλ‘νΌν°μΈ currentSpeedλ₯Ό μ€λ²λΌμ΄λ©νμ¬ μ°μ° νλ‘νΌν°λ‘ λ°κΎΈκ³ μκ³ , μ½κΈ° μ μ© νλ‘νΌν°μΈ description λν μ€λ²λΌμ΄λ©νμ¬ μ½κ³ μ°κΈ°κ° λͺ¨λ κ°λ₯ν νλ‘νΌν°λ‘ λ°κΏμ£Όκ³ μλ€.
Β μμλ°μ νλ‘νΌν°λ₯Ό μ€λ²λΌμ΄λ©νλ κ³Όμ μμ μ°λ¦¬λ νμμ λ°λΌ νλ‘νΌν° μ΅μ λ²λ₯Ό λΆμΌ μ μλ€. λΆλͺ¨ ν΄λμ€μμ νλ‘νΌν°κ° μμλ‘ μ μΈλμκ±°λ μ½κΈ° μ μ© νλ‘νΌν°λ‘ μ μΈλμ§λ§ μμλ€λ©΄ νλ‘νΌν°λ₯Ό μ€λ²λΌμ΄λ©ν λ νλ‘νΌν° μ΅μ λ² κ΅¬λ¬Έμ μΆκ°νλ©΄ λλ€.
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
self.gear = Int(currentSpeed / 10.0) + 1
}
}
}
Β μλ κΈ°μ΄ μ°¨λμ μ¬μ©μκ° μ§μ κΈ°μ΄μλ₯Ό μ‘°μ νλ λμ νμ¬ μλμ λ°λΌ μλμΌλ‘ κΈ°μ΄ λ¨μκ° κ²°μ λμ΄μΌ νλ€. μ΄λ₯Ό μν΄ νμ¬ μλκ° λ³ν λ κ·Έμ λ°λΌ κΈ°μ΄ μλ ν¨κ» λ³κ²½λ μ μλλ‘ currentSpeed μμ±μ didSet μ΅μ λ²λ₯Ό μΆκ°νκ³ μλ€.
Β λ©μλλ₯Ό μ€λ²λΌμ΄λ© νκΈ° μν΄μλ μ€λ²λΌμ΄λ© λμμ΄ λλ λ©μλμ 맀κ°λ³μ κ°μλ νμ , κ·Έλ¦¬κ³ λ°ν νμ μ λ³κ²½ν μ μλ€βοΈ
class Bike: Vehicle {
override func makeNoise(){
print("λΉ λΌλΉ λΌλΉ λΌλ°€")
}
}
let bk = Bike()
bk.makeNoise()
Β Bike ν΄λμ€κ° Vehicle ν΄λμ€λ₯Ό μμλ°μ makeNoise λ©μλλ₯Ό μ€λ²λΌμ΄λ©(μ¬μ μ)νκ³ μλ€. λ©μλμ κ²½μ° μ€λ²λΌμ΄λ©μ μ μ½ μ‘°κ±΄μΌλ‘ 맀κ°λ³μ νμ μ΄λ λ°ν νμ μ κ·Έλλ‘ μ μ§ν΄μΌ νλ κ²μ μ€μννΈκ° λ©μλ μ€λ²λ‘λ©(Overloading)μ μ§μνκΈ° λλ¬Έμ΄λ€.
Β μ€λ²λ‘λ©μ΄λ μ μ¬λΌκ³ ν΄μλλλ° μ°¨κ³‘μ°¨κ³‘ μλλ€λ λ»μΌλ‘, νλμ λ©μλ μ΄λ¦μΌλ‘ μ¬λ¬κ°μ§ λ©μλλ₯Ό λ§λ€μ΄ μλ κ²μ΄λ€.
Β κ°μ μ΄λ¦μ λ©μλλΌλ μ μλ 맀κ°λ³μμ νμ μ΄ λ€λ₯΄λ©΄ μλ‘ λ€λ₯Έ λ©μλλ₯Ό μ²λ¦¬νλ κ²μ΄ μ€λ²λ‘λ©μ΄λ€.
Β λ°λΌμ μ΄λ¦μ΄ κ°κ³ 맀κ°λ³μμ κ°μκΉμ§ μΌμΉνλλΌλ νμ μ΄ λ€λ₯΄λ©΄ μλ‘ λ€λ₯Έ λ©μλλ‘ κ°μ£Όνλ€. λν 맀κ°λ³μλͺ κΉμ§ λ©μλμ μ μμ ν¬ν¨λλ―λ‘ λ§€κ°λ³μμ κ°μ, νμ μ΄ λͺ¨λ μΌμΉνμ¬λ 맀κ°λ³μλͺ μ΄ λ€λ₯΄λ©΄ μλ‘μ΄ λ©μλλ₯Ό μ μν κ²μ΄ λλ€.
class HybridCar: Car {
// μ무κ²λ μΆκ° μ μΈνμ§ μμ
}
class KickBoard: Vehicle {
// μ무κ²λ μΆκ° μ μΈνμ§ μμ
}
let h = HybridCar()
h.description
// "Car : engineLevel=0 so currentSpeed=0.0"
let k = KickBoard()
k.description
//"μκ°λΉ 0.0μ μλλ‘ μ΄λνκ³ μμ΅λλ€"
Β μ μ½λμμ Car ν΄λμ€μ KickBoard ν΄λμ€λ Vehicle ν΄λμ€λ₯Ό μμ λ°κ³ μκ³ , HybridCar ν΄λμ€λ Car ν΄λμ€λ₯Ό μμ λ°κ³ μλ€. μ¦ HybridCar ν΄λμ€ KickBoard ν΄λμ€ λͺ¨λ μ΅μ’ μ μΈ μμν΄λμ€λ Vehicleμ΄λ€. λν λ λͺ¨λμ description νλ‘νΌν°κ° 곡ν΅μΌλ‘ μ‘΄μ¬νμ§λ§, νλ‘νΌν°κ° λ΄κ³ μλ κ°μ λ€λ₯Έ κ²μ μ μ μλ€.
Β νλ‘νΌν°λ λ©μλλ₯Ό μ€λ²λΌμ΄λ©νλ©΄ λλ λ³Έλμ κ°μ΄λ κΈ°λ₯μ μ¬μ©ν μ μμ κ²κ°μ΄ 보μ΄μ§λ§ μ€μννΈμμλ μμλ°μ λΆλͺ¨ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μλλ‘ βοΈsuperβ¨λΌλ κ°μ²΄λ₯Ό μ 곡νμ¬ μ΄ κ°μ²΄λ₯Ό μ΄μ©νμ¬ μ ꡬ문μ μ¬μ©νλ©΄ λΆλͺ¨ ν΄λμ€μ νλ‘νΌν°λ λ©μλλ₯Ό νΈμΆν μ μλ€. μ€λ²λΌμ΄λ©μ νμ¬μ μμ ν΄λμ€λΆν° μ μ©λλ κ²μ΄λ―λ‘ λΆλͺ¨ ν΄λμ€μ νλ‘νΌν°λ λ©μλμλ λ³Έλμ κ°κ³Ό κΈ°λ₯μ΄ κ·Έλλ‘ μ μλμ΄ μλ€.
Β μλ₯Ό λ€μ΄ someMethod()λΌλ μ΄λ¦μ μ€λ²λΌμ΄λ©λ λ©μλλ λΆλͺ¨ ν΄λμ€ λ 벨μμ μ μλ someMethod()λ₯Ό super.someMethod()λΌλ ννμΌλ‘ νΈμΆν μ μλ€. λΆλͺ¨ ν΄λμ€μ νλ‘νΌν°λ λ©μλλ₯Ό μ°Έμ‘°ν λλ μμ μ μΈμ€ν΄μ€λ₯Ό selfκ°μ²΄λ₯Ό μ΄μ©νμ¬ μ°Έμ‘°νλ κ²μ²λΌ self λμ superκ°μ²΄λ₯Ό μ¬μ©νκΈ°λ§ νλ©΄λλ κ²μ΄λ€.
Β κ²½μ°μ λ°λΌ μ€λ²λΌμ΄λ©μ λ§μμΌ νλ κ²½μ°λ μλ€. μ€μννΈμμλ μμν΄λμ€μμ μ μν λ©μλλ νλ‘νΌν°κ° νμ ν΄λμ€μμ μ€λ²λΌμ΄λ©λλ κ²μ μ°¨λ¨ν μ μλλ‘ finalν€μλλ₯Ό μ 곡νλ€. λ§μ½ μ μν λ©μλλ νλ‘νΌν°κ° νμ ν΄λμ€μμ μ€λ²λΌμ΄λ© λλ κ²μ μμΉ μλλ€λ©΄ νλ‘νΌν°λ λ©μλλ₯Ό μ μνλ var, func λ±μ ν€μλ μμ final ν€μλλ₯Ό λΆμ¬μ£Όλ©΄ λλ€.
Β λν final ν€μλλ νλ‘νΌν° λ©μλ λΏ μλλΌ ν΄λμ€ μ체μλ λΆμΌ μ μλλ° μ΄ κ²½μ° ν΄λμ€λ μμ μμ²΄κ° μ°¨λ¨λμ΄, μ΄λ€ ν΄λμ€λ μ΄ ν΄λμ€λ₯Ό μλΈν΄λμ±ν μ μκ² λλ€. π π π