다형성
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 32번째.
다형성은 하나의 코드 조각이 여러 타입의 값과 함께 작동하고, 각 값이 자신만의 방식으로 응답하는 것을 의미합니다. 아래 루프는 어떤 동물을 담고 있는지 알지 못한 채 sound()를 호출합니다:
class Animal {
func sound() -> String { "..." }
}
class Dog: Animal {
override func sound() -> String { "Woof" }
}
class Cow: Animal {
override func sound() -> String { "Moo" }
}
let farm: [Animal] = [Dog(), Cow(), Dog()]
for a in farm { print(a.sound()) }출력:
Woof
Moo
WoofSwift는 실제 객체를 바탕으로 런타임에 실행할 구현을 결정합니다. 변수에 선언된 타입은 중요하지 않습니다. 중요한 것은 객체의 타입입니다.
class Animal {
func sound() -> String { "..." }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
let pet: Animal = Cat()
print(pet.sound())출력:
Meow프로토콜은 구조체와 열거형에 동일한 유연성을 제공합니다. 여기서는 하나의 함수가 Drawable 값의 모든 목록을 출력합니다:
protocol Drawable {
func draw() -> String
}
struct Line: Drawable {
let length: Int
func draw() -> String { String(repeating: "-", count: length) }
}
struct Box: Drawable {
func draw() -> String { "[ ]" }
}
func render(_ items: [any Drawable]) -> String {
items.map { $0.draw() }.joined(separator: " ")
}
print(render([Line(length: 3), Box(), Line(length: 1)]))출력:
--- [ ] -다형성은 여러 종류의 대상에 대한 긴 if/switch 연쇄를 대체합니다. 값이 무엇인지 물은 다음 무엇을 할지 결정하는 대신, 값에게 그 작업을 하도록 요청합니다. 새로운 종류를 추가한다는 것은 모든 switch를 수정하는 것이 아니라 새로운 타입을 추가하는 것을 의미합니다:
// 다형성 없이
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }
// 다형성으로
for animal in farm { print(animal.sound()) }챌린지
쉬움Animal에는 name, legs()(4개) 및 describe()가 있으며, legs()와 sound()을 바탕으로 Rex has 4 legs and says Woof를 반환합니다. legs()와 sound()만 재정의하여 Dog(sound Woof), Bird(다리 2개, sound Tweet), Snake(다리 0개, sound Hiss)를 선언하세요.
제공된 코드는 dog,Rex, bird,Pip 또는 snake,Kaa 형식의 줄을 읽고, 동물들을 하나의 [Animal] 배열에 저장한 다음 각각에 대해 describe()를 출력합니다.
코드는 Animal.swift, Dog.swift, Bird.swift 및 Snake.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.
직접 해보기
// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
var zoo: [Animal] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
switch p[0] {
case "dog": zoo.append(Dog(name: p[1]))
case "bird": zoo.append(Bird(name: p[1]))
default: zoo.append(Snake(name: p[1]))
}
}
for a in zoo { print(a.describe()) }
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드