Tunko Development Diary

swift) required init 요구 이니셜라이저 본문

Development/iOS 개발

swift) required init 요구 이니셜라이저

Tunko 2022. 6. 17. 23:42

required 수식어를 클래스의 이니셜라이저 앞에 명시해주면 이 클래스를 상속받은 자식 클래스에서 반드시 해당 이니셜라이저를 구현해주어야 합니다.

다시 말하면 상속받을 때 반드시 재 정의해야 하는 이니셜라이저 앞에 required 수식어를 붙여줍니다. 다만 자식클래스에서 요구 이니셜라이저를 재정의할 때는 override수식어 대신에 required수식어를 사용합니다.

class Person {
	var name: String
	required init() {
		self.name = "Unknown"
	}
}

class Student : Person {
	var major : String = "Unknown"
}

let 학생 : Student = Student()

Person 클래스에 init() 요청 이니셜라이저를 구현해주었지만 person클래스를 상속받은 student 클래스에서는 요구 이니셜라이저를 구현하지 않았습니다.

이는 Student 클래스의 major 프로퍼티에 기본값이 있으며 별다른 지정 이니셜라이저가 없기 때문에 이니셜라이저가 자동으로 상속된것입니다.

만약 Student 클래스에 새로운 지정 이니셜 라이저를 구현한다면 부모클래스로부터 이니셜라이저가 자동으로 상속되지 않으므로 요구 이니셜라이저를 구현해주어야 합니다.

class Person {
    var name: String
    required init() {
        self.name = "Unknown"
    }
}

class Student : Person {
    var major : String = "Unknown"
    init(major : String) {
        self.major = major
        super.init()
    }

    required init() {
        self.major = "Unknown"
        super.init()
    }
}

class UniversityStudent : Student {
    var grade : String

    init(grade: String) {
        self.grade = grade
        super.init()
    }

    required init() {
        self.grade = "F"
        super.init()
    }
}

Student 와 UniversityStudent 클래스는 자신만의 지정 이니셜라이저를 구현했습니다. 그래서 부모클래스의 이니셜라이저를 이니셜라이저 자동 상속 규칙에 부함하지 않는 자식 클래스인 Student에도 구현해주고, 그 자식클래스인 UniversityStudent 클래스에도 구현해주어야 합니다. 이니셜라이저 자동 상속의 규칙에 부합하지 않는 한, 요구 이니셜라이저는 반드시 구현해주어야합니다.

만약 부모클래스의 일반 이니셜라이저를 자신의 클래스부터 요구 이니셜라이저로 변경할 수도 있습니다. 그럴 때는 required override를 명시해주어 재정의된과 동시에 요구 이니셜라이저가 될 것임을 명시해주어야 합니다.

또, 편의 이니셜라이저도 요구 이니셜라이저로 변경될 수 있습니다. 마찬가지로 required convienience를 명시해주어 편의 이니셜라이저가 앞으로 요구될 것임을 명시해주면 됩니다.

class Person {
    var name: String
    init() {
        self.name = "Unknown"
    }
}

class Student : Person {
    var major : String = "Unknown"
    init(major : String) {
        self.major = major
        super.init()
    }

    required override init() {
        self.major = "Unknown"
        super.init()
    }

    required convenience init(name: String) {
        self.init()
        self.name = name
    }
}

class UniversityStudent : Student {
    var grade : String

    init(grade: String) {
        self.grade = grade
        super.init()
    }

    required init() {
        self.grade = "F"
        super.init()
    }

    required convenience init(name: String) {
        self.init()
        self.name = name
    }
}

Person클래스에는 별다른 요구 이니셜라이저가 없습니다. 다만 Student 클래스에서 Person의 init() 이니셜라이저를 재정의하면서 요구 이니셜라이저로 변경했습니다. 따라서 UniversityStudent 클래스에서는 init() 이니셜라이저를 요구 이니셜라이저로 필히 구현해주어야 합니다. 또, Student 클래스의 편의 이니셜라이저 init(name:) 이 요구 이니셜라이저로 지정되었기 때문에 UniversityStudent 클래스에서 다시 구현해주어야 합니다.

반응형

'Development > iOS 개발' 카테고리의 다른 글

swift) ?? 연산자  (0) 2022.06.20
associatedtype 이란?  (0) 2022.06.17
Swift ARC [weak self] 란?  (0) 2022.06.15
xcode 13 vim Editing Mode  (0) 2021.10.13
iOS13,14,15 네비게이션 바 투명 상태 처리  (0) 2021.09.23
Comments