서브클래스
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 22번째.
상속을 사용하면 클래스가 다른 클래스를 기반으로 확장할 수 있습니다. class Dog: Animal은 Dog을 슈퍼클래스인 Animal의 서브클래스로 만듭니다. 즉, 개는 동물의 모든 속성과 메서드를 가지며, 여기에 Dog이 추가하는 기능도 가집니다.
class Animal {
var name: String
init(name: String) { self.name = name }
func describe() -> String { "\(name) is an animal" }
}
class Dog: Animal {
func fetch() -> String { "\(name) fetches the ball" }
}
let rex = Dog(name: "Rex")
print(rex.describe())
print(rex.fetch())출력:
Rex is an animal
Rex fetches the ball저장된 속성을 추가하지 않는 서브클래스는 슈퍼클래스의 이니셜라이저를 상속하므로, Dog(name:)는 Dog에 init이 없어도 작동합니다. 상속은 is-a 관계를 모델링합니다. 모든 개는 동물이므로, Dog는 Animal이 필요한 모든 곳에서 사용할 수 있습니다:
class Animal {
var name: String
init(name: String) { self.name = name }
}
class Cat: Animal {}
class Dog: Animal {}
let pets: [Animal] = [Cat(name: "Tom"), Dog(name: "Rex")]
for pet in pets { print(pet.name) }출력:
Tom
Rex클래스만 상속을 지원하며, 구조체와 열거형은 상속할 수 없습니다. 클래스에는 최대 하나의 상위 클래스가 있지만, 상위 클래스에는 여러 하위 클래스가 있을 수 있어 계층 구조를 형성합니다:
class Vehicle { var wheels = 0 }
class Car: Vehicle { } // Car는 Vehicle입니다
class Bike: Vehicle { } // Bike는 Vehicle입니다
// struct Truck: Vehicle { } // error: structs는 상속할 수 없습니다모든 서브클래스가 공유하는 내용은 슈퍼클래스에 넣고, 각 서브클래스에는 차이점만 넣으세요. 한 타입이 다른 타입의 실제 한 종류가 아니라면 상속은 잘못된 도구입니다. 다른 타입을 담는 속성을 사용하는 편이 더 적합한 경우가 많습니다.
class Shape {
var name: String
init(name: String) { self.name = name }
func label() -> String { "a \(name)" }
}
class Square: Shape {
var side = 1.0
func area() -> Double { side * side }
}
let s = Square(name: "square")
s.side = 3
print(s.label())
print(s.area())출력:
a square
9.0챌린지
쉬움Employee는 name과 salary를 저장하고, 급여를 백분율만큼 증가시키는(내림 처리) raise(by:) 메서드를 가집니다. 저장 프로퍼티 reports(처음에는 비어 있는 이름 배열)와 addReport(_:) 메서드를 추가하는 서브클래스 Manager를 선언하고, 보고서 수를 반환하는 teamSize() 메서드도 선언하세요.
제공된 코드는 첫 번째 줄(name,salary)에서 관리자를 생성하고, 그다음 줄부터 각 이름을 보고서로 추가한 후, 10% 인상을 적용하고 Ada earns 5500 and leads 2를 출력합니다.
코드는 Employee.swift와 Manager.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
// 제공된 입출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let head = input[0].split(separator: ",").map(String.init)
let boss = Manager(name: head[0], salary: Int(head[1])!)
for name in input.dropFirst() { boss.addReport(name) }
boss.raise(by: 10)
print("\(boss.name) earns \(boss.salary) and leads \(boss.teamSize())")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드