[Swift] 상속
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
상속
- 클래스는 메서드나 프로퍼티 등을 다른 클래스로 부터 상속받을 수 있음
- 어떤 클래스로부터 상속을 받음 → 자식클래스(Subclass / Child-class)
- 자식클래스에게 자신의 특성을 물려준 클래스 → 부모클래스(Superclass / Parents-class)
- 부모클래스로부터 물려받은 메서드, 프로퍼티, 서브스크립트 등을 자신만의 내용으로 재정의 가능
- 다른 클래스로부터 상속받지 않는 클래스 → 기반클래스(Base class)
클래스 상속
- 기반클래스를 다른 클래스에서 물려받는 것 → 상속
- 부모클래스의 메서드, 프로퍼티 등을 재정의 / 기반클래스의 기능이나 프로퍼티를 물려받고 자신의 기능을 추가할 수 있음
- 어떤 클래스의 자식클래스가 다른 클래스의 부모클래스가 될 수 있음
- Person 클래스를 상속 받은 Student 클래스
class Person{
var names: String = ""
var age:Int = 0
var introuduction: String{
return "이름 : \(names), 나이 : \(age)"
}
func speak(){
print("가나다라마바사")
}
}
class Student: Person{
var grade: String = "F"
func study(){
print("열공중...")
}
}
let lee: Student = Student()
lee.names = "Lee"
lee.age = 50
lee.grade = "A+"
print(lee.introduction) // 이름 : Lee, 나이 : 50
print(lee.grade, lee.age) // A+ 50
lee.study() // 열공중...
재정의(override)
- 재정의(override) : 자식클래스가 부모클래스로부터 물려받은 특성을 그대로 사용하지 않고 자신만의 기능으로 변경하여 사용하는 것
- override 키워드를 사용, 스위프트 컴파일러가 조상클래스(부모를 포함한 그 상위 부모클래스)에 해당 특성이 있는지 확인 후 재정의
- 부모클래스의 특성을 자식클래스에서 사용하고 싶다면 → super 프로퍼티 사용
- super 키워드를 타입 메서드 내에서 사용한다면? → 부모 클래스의 타입 메서드와 타입 프로퍼티에 접근 가능
- super 키워드를 인스턴스 메서드 내에서 사용한다면? → 부모클래스의 인스턴스 메서드와 인스턴스 프로퍼티, 서브스크립트 접근 가능
class Person{
var name: String = ""
var age:Int = 0
var koreanAge: Int{
return self.age + 1
}
var introduction: String{
return "이름 : \(name), 나이 : \(age)"
}
}
class Student: Person{
var grade: String = "F"
override var introduction: String{
return super.introduction + " " + "학점 : \(self.grade)"
}
override var koreanAge: Int{
get{
return super.koreanAge
}
set{
self.age = newValue - 1
}
}
}
let kim: Person = Person()
kim.name = "kim"
kim.age = 23
print(kim.introduction) // 이름 : kim, 나이 : 23
print(kim.koreanAge) // 24
let lee: Student = Student()
lee.name = "lee"
lee.age = 15
lee.koreanAge = 16
print(lee.introduction) // 이름 : lee, 나이 : 15 학점 : F
print(lee.koreanAge) // 16
클래스의 이니셜라이저
- 값 타입의 이니셜라이저는 구분하지 않지만, 클래스에서는 지정 이니셜라이저와 편의 이니셜라이저로 구분
- 지정 이니셜라이저(Designated Initializer)
- 클래스의 주요 이니셜라이저
- 필요에 따라 부모클래스의 이니셜라이저 호출 가능
- 이니셜라이저가 정의된 클래스의 모든 프로퍼티를 초기화하는 임무를 가짐
- 모든 클래스는 하나 이상의 지정 이니셜라이저를 가짐
- 편의 이니셜라이저(Convenience Initializer)
- 초기화를 조금 더 손쉽게 도와주는 역할
- 지정 이니셜라이저를 자신 내부에서 호출
- 필수 요소는 아님 → 클래스 설계자의 의도대로 외부에서 사용하길 원하거나 인스턴스 생성 코드를 작성하는 수고를 덜 때 유용
- convenience 지정자를 init 키워드 앞에 명시
class Person{
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "UnKnown")
}
}
class Student: Person{
var major: String = "Swift"
}
let kim: Person = Person(name: "kim")
let lee: Student = Student(name: "lee")
print(kim.name) // kim
print(lee.name) // lee
let wizplan: Person = Person()
let jinSung: Student = Student()
print(wizplan.name) // UnKnown
print(jinSung.name) // UnKnown
요구 이니셜라이저
- required 수식어를 클래스의 이니셜라이저 앞에 명시
- 상속받을 때 반드시 재정의해야 하는 이니셜라이저 앞에 required 붙임
- 자식클래스에서 요구 이니셜라이저를 재정의할 때는 override 대신 required 수식어 사용
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()
}
}
let jisoo: Student = Student()
print(jisoo.major) // UnKnown
let kim: Student = Student(major: "Swift")
print(kim.major) // Swift
let lee: UniversityStudent = UniversityStudent(grade: "A+")
print(lee.grade) // A+
'iOS > Swift' 카테고리의 다른 글
[Swift] 인스턴스 (0) | 2022.09.28 |
---|---|
[Swift] Extension (0) | 2022.09.27 |
[Swift] 서브스크립트 (2) | 2022.09.22 |
[Swift] print(_:separator:terminator:) (0) | 2022.09.21 |
[Swift] 프로퍼티와 메서드 (0) | 2022.09.20 |