* 상속은 언제 사용하면 좋은가?
(1) Single Responsibility (단일 책임)
: 하나의 클래스는 한 가지의 역할만 해야 한다.
(2) Type Safety (타입이 분명해야 할 때)
: 특정 조건의 타입 객체를 사용하고자 할 때
(3) Shared Base Classes (다자녀가 있다)
: 동일한 행위를 다중 객체에서 사용
(4) Extensibilty (확장성이 필요한 경우)
(5) Identity (정체를 파악하기 위해)
* 상속된 자식 클래스는 부모 클래스의 형태와 다르게 생성할 수 있다.
ex) let student1 = Student(firstName: "Mike", lastName: "Kim")
let student2 = StudentAthlete(sports: ["Baseball"], firstName: "Jay", lastName: "Lee")
* 상속한 자식 클래스에서 별도의 프로퍼티를 생성하게 되면 반드시, initialize()를 해주어야 한다.
* 2-phase Initialization
: 상속 기능 이용 시, 반드시 지켜야 할 2가지 단계
SubClass에 생성된 프로퍼티에 대해 먼저 값을 할당(initialize)해주고, 그다음 SuperClass의 프로퍼티를 할당(initialize)해주어야 한다.
- Phase 1
: SubClass의 프로퍼티는 SuperClass initialize 하기 전에 할당되어야 한다.
- Phase 2
: SubClass의 메서드는 프로퍼티와 SuperClass initialize가 모두 할당된 다음 호출되어야 한다.
< 핵심 정리 >
< 예제 코드 >
import UIKit
// 처음 코드
struct Grade {
var letter: Character
var points: Double
var credits: Double
}
class Person {
var firstName: String
var lastName: String
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
func printMyName() {
print("My name is \(firstName) \(lastName)")
}
}
class Student: Person {
var grades: [Grade] = []
}
// 학생인데 운동선수
class StudentAthlete: Student {
var minimumTrainingTime: Int = 2
var trainedTime: Int = 0
var sports: [String]
init(firstName: String, lastName: String, sports: [String]) {
// Phase 1 (SubClass에 생성된 프로퍼티를 할당해주어야 메소드를 이용 가능)
self.sports = sports
//self.train() // --> 'self' used in method call 'train' before 'super.init' call
super.init(firstName: firstName, lastName: lastName)
// Phase 2 (Method는 반드시 Property가 모두 초기화 된 이후에 사용되어야 한다.)
self.train()
}
func train() {
trainedTime += 1
}
}
// 운동선인데 축구선수
class FootballPlayer: StudentAthlete {
var footballTeam = "FC Swift"
override func train() {
trainedTime += 2
}
}
let student1 = Student(firstName: "Mike", lastName: "Lee")
let student2 = StudentAthlete(firstName: "Jason", lastName: "Son", sports: ["Football"])
'iOS' 카테고리의 다른 글
[20일차] TodoList 앱 만들기 - 1 (0) | 2020.08.08 |
---|---|
[19일차] Designated Init vs. Convenience Init (0) | 2020.08.07 |
[17일차] Class와 Struct를 사용해야 할 때 (0) | 2020.08.05 |
[16일차] Class 사용 (0) | 2020.08.04 |
[15일차] Property vs Method (0) | 2020.08.04 |
댓글