ํด๋์ค๋ ๋ฉ์๋, ํ๋กํผํฐ์ ๋ค๋ฅธ ํน์ง(characteristics)์ ๋ค๋ฅธ ํด๋์ค๋ก ๋ถํฐ ์์ํ ์ ์๋ค. ์ด๊ฒ์ด Swift์์ ํด๋์ค๊ฐ ๋ค๋ฅธ ํ์ ๊ณผ ๊ตฌ๋ถ๋๋ ๊ทผ๋ณธ์ ์ธ ์์์ด๋ค. ํด๋์ค์์๋ ์ ์ฅ๋ ํ๋กํผํฐ์ ๊ณ์ฐ๋ ํ๋กํผํฐ์ ์๊ด์์ด ์์๋ฐ์ ํ๋กํผํฐ์ ํ๋กํผํฐ ์ต์ ๋ฒ๋ฅผ ์ค์ ํด์ ๊ฐ ์ค์ ์ ๋ฐ์ํ ์ ์๋ค.
๊ธฐ๋ฐ ํด๋์ค ์ ์ (Defining a Base Class)
๋ค๋ฅธ ์ด๋ค ํด๋์ค๋ก๋ถํฐ๋ ์์๋ฐ์ง ์์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ ํด๋์ค๋ผ ํ๋ค
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
}
}
์ ์ฝ๋๋ ํ๊ฒ(Vehicle)์ด๋ผ๋ ๊ธฐ๋ฐ ํด๋์ค๋ฅผ ํ๋ ์ ์ํ ๊ฒ์ด๋ค. ์ด ํ๊ฒ์ ํ์ฌ์๋(currentSpeed)๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ๊ณ ์๊ณ description์ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ก ์ ์ธํ๋ค. makeNoise()๋ผ๋ ๋ฉ์๋๋ ๊ฐ๊ณ ์๋ค. ์ด ํด๋์ค๋ฅผ ์ด์ฉํด ํ๊ฒ ๊ฐ์ฒด๋ฅผ ํ๋ ์์ฑํ๋ค.
์๋ธํด๋์ฑ (Subclassing)
์์์ ํ๋ฉด ๋ถ๋ชจ๋ก ๋ถํฐ ์ฑ๊ฒฉ์ ์์๋ฐ๊ณ ์๊ธฐ ์์ ๊ณ ์ ์ ํน์ฑ๋ ์ถ๊ฐํ ์ ์๋ค.
class SomeSubclass: SomeSuperclass {
// subclass definition goes here
}
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
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
Bicycle๊ฐ์ฒด๋ฅผ ์์ฑํด ๊ณ ์ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ฌผ๋ก ๋ถ๋ชจ๋ก๋ถํฐ ๋ฌผ๋ ค๋ฐ์ currentSpeed, description์์ฑ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์๋ธํด๋์ค๋ก ์์ฑ๋ ํด๋์ค๋ฅผ ๋ค์ ์๋ธํด๋์ฑ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
Tandem๊ฐ์ฒด ์์๋ Tandem๊ฐ์ฒด ๊ณ ์ ์์ฑ์ธ currentNumberOfPassengers์ ์์ ์ ๋ถ๋ชจ Bicycle์ ์์ฑ ๊ทธ๋ฆฌ๊ณ ์กฐ๋ถ๋ชจ์ธ Vehicle์ ์์ฑ๋ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ค๋ฒ๋ผ์ด๋ฉ (Overriding)
์๋ธํด๋์ค์์๋ ๋ถ๋ชจํด๋์ค์์ ์์๋ฐ์ ๊ฒ์ ์ฌ์ ์ ํ ์ ์๋ค. ์ด๊ฒ์ overriding ์ด๋ผ ๋ถ๋ฅด๋๋ฐ, ์ค๋ฒ๋ผ์ด๋ฉ์ ์ธ์คํด์ค ๋ฉ์๋, ํ์ ๋ฉ์๋, ์ธ์คํด์ค ํ๋กํผํฐ, ํ์ ํ๋กํผํฐ, ์๋ธ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋ํด ๊ฐ๋ฅํ๋ค. ์ค๋ฒ๋ผ์ด๋๋ฅผ ์ํด์๋ ๋ค๋ฅธ ์ ์ธ ์์ overrideํค์๋๋ฅผ ๋ถ์ฌ์ค๋ค. Swift์์๋ ์ด overrideํค์๋๋ฅผ ๋ณด๋ฉด ๋ถ๋ชจ์ ๊ทธ ์ ์๊ฐ ์๋์ง ํ์ธํ๋ค.
๋ถ๋ชจํด๋์ค์ ๋ฉ์๋, ํ๋กํผํฐ, ์๋ธ์คํฌ๋ฆฝํธ์ ์ ๊ทผ (Accessing Superclass Methods, Properties, and Subscripts)
superํค์๋์ ์ ๋ฌธ๋ฒ ํน์ ์ธ๋ฑ์ค ๊ตฌ๋ฌธ์ผ๋ก ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋, ํ๋กํผํฐ, ์๋ธ์คํฌ๋ฆฝํธ์ ์ ๊ทผํ ์ ์๋ค. super.someMethod, super.someProperty, super[someIndex]
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ (Overriding Methods)
์์๋ฐ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๊ธฐ ์ํด์๋ ๋ฉ์๋ ์ ์ธ ์์ overrideํค์๋๋ฅผ ๋ถ์ด๊ณ ๋ด์ฉ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
// Prints "Choo Choo" : ์๋ก ์ ์ํ ๋ด์ฉ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
ํ๋กํผํฐ ์ค๋ฒ๋ผ์ด๋ (Overriding Properties)
์๋ธํด๋์ค์์๋ ์์๋ฐ์ ์ ์ฅ๋ ํ๋กํผํฐ, ๊ณ์ฐ๋ ํ๋กํผํฐ ๋ชจ๋ ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅํ๋ค. ์ค๋ฒ๋ผ์ด๋์์๋ ํ๋กํผํฐ์ ์ด๋ฆ๊ณผ ํ์ ์ ๋ช ์ํด์ผํ๋ค. ์๋ํ๋ฉด ์๋ธํด๋์ค์์๋ ๋จ์ํ ์์๋ฐ์ ํน์ ํ์ ํ๋กํผํฐ๊ฐ ์๋ค๋ ์ ๋๋ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์์๋ฐ์ ์ฝ๊ธฐ์ ์ฉ(read only) ํ๋กํผํฐ๋ getter/setter๋ฅผ ์ ์ํด์ ์ฝ๊ณ /์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ(read-write) ํ๋กํผํฐ๋ก ๋ณ๊ฒฝํด์ ์ ๊ณต ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๋ฐ๋์ ์ฝ๊ณ /์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ํ๋กํผํฐ๋ฅผ ์ฝ๊ธฐ์ ์ฉ ํ๋กํผํฐ๋ก ์ ์ธํ๋ ๊ฒ์ ํ ์ ์๋ค.
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)
์ด๋ฏธ ๋ถ๋ชจํด๋์ค์ ์ ์ธ๋ ํ๋กํผํฐ ์ต์ ๋ฒ๋ ์๋ธํด๋์ค์์ ์ฌ์ ์ํด ์ฌ์ฉํ ์ ์๋ค.
NOTEโ๏ธ
์์ ํ๋กํผํฐ์ ์ฝ๊ธฐ์ ์ฉ ํ๋กํผํฐ์๋ ์ต์ ๋ฒ๋ฅผ ๋ถ์ผ ์ ์๋ค. ์ด ํ๋กํผํฐ๋ ์ ์ ๊ทธ๋๋ก set์ ํ ์ ์๋ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ ๊ฐ์ ํ๋กํผํฐ์ ์ต์ ๋ฒ๋ฅผ ์ถ๊ฐํ๊ณ setter๋ฅผ ์ถ๊ฐํด ๋์ ๋์์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฏธ setter๋ฅผ ์ค์ ํ๋ค๋ฉด ์ต์ ๋ฒ๋ฅผ ๋ถ์ธ ๊ฒ๊ณผ ๊ฐ์ ๋์์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
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
'๐ฆ Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Initialization (0) | 2022.07.13 |
---|---|
Subscripts (0) | 2022.07.04 |
Methods (0) | 2022.07.04 |
Properties (0) | 2022.07.04 |
Structures and Classes (0) | 2022.06.22 |