본문 바로가기
iOS

[18일차] Class 생성자 이해하기 (2-phase Initialization)

by 디지털노마더 2020. 8. 7.

* 상속은 언제 사용하면 좋은가?

(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

댓글