상속
클래스는 메서드나 프로퍼티 등을 다른 클래스로부터 상속받을 수 있다.
final
키워드를 사용하면 재정의 (Override
) 방지 가능static
키워드를 사용해 타입 메소드를 만들면 재정의 불가능class
키워드를 사용해 타입 메소드를 만들면 재정의 가능class
앞에final
을 붙이면static
키워드를 사용한 것과 동일override
키워드를 사용하여 부모 클래스 메소드 재정의 가능
자식 / 부모 / 기반 클래스
- A클래스로 부터 상속을 받으면 상속을 받은 B클래스는 A클래스의 자식클래스(
Subclass
/Child-class)
라고 한다. - 자식클래스에게 자신의 특성을 물려준 A클래스를 부모클래스(
Superclass
/Parents-class)
라고 한다. - 다른 클래스로부터 상속을 받지 않은 클래스를 기반클래스(
Base class
)라고 한다. (대부분의 클래스)
// SuperClass 부모 클래스
class Seogun {
func name() {
print("저의 이름은 서근 입니다")
}
}
// SubClass 자식 클래스
class Mijin: Seogun {
override func name() {
print("저의 이름은 미진 입니다")
}
}
// Base class 기반 클래스
class Person {
var name: String
var age: Int
var introduction: String {
return "이름 : \(name). 나이 : \(age)"
}
}
상속 관계
NSObject > UIResponder > UIView > UIControl > UIButton/UILabel/UISlider...
상속은 Swift의 다른 타입과 클래시를 구별 짓는 클래스 만의 특징이다.
- 클래스는 부모클래스로부터 물려받은 메서드 호출 및 프로퍼티 접근 그리고 서브스크립트 사용 가능
- 부모클래스로부터 물려받은 메서드, 프로퍼티, 서브스크립트 등을 자신만의 내용으로 재정의(
override
) 가능 - 자식클래스에서 재정의 할 때 자식클래스가 부모클래스의 요소를 재정의 한다는 것을 명확히 확인해야 함
- 상속받은 프로퍼티에 값이 변경되었을 때 알려주는 프로퍼티 옵저버 구현 가능
- 연산 프로퍼티를 정의한 클래스에선 연산 프로퍼티에 프로퍼티 옵저버를 사용할 수 없지만, 부모클래스에서 연산 또는 저장 프로퍼티로 정의했으면 자식클래스에서는 프로퍼티 옵저버를 구현할 수 있음
class 클래스명: 부모클래스명 {
프로퍼티와 메서드
}
먼저, 아무것도 상속받지 않은 Person
이라는 기반 클래스를 만들고 name
, Int
저장 프로퍼티와 introduction
이라는 연산 프로퍼티, speak()
라는 메서드를 정의해보자.
// Base class 기반 클래스
class Person {
//저장 프로퍼티
var name: String
var age: Int
//연산 프로퍼티
var introduction: String {
return "이름 : \(name). 나이 : \(age)"
}
//메서드
func speak() {
print("안녕하세요. 서근 개발노트 입니다!")
}
}
//인스턴스
let seogun: Person = Person()
seogun.name = "서근"
seogun.age = 99
print(seogun.introduction) //
seogun.speak() //안녕하세요. 서근 개발노트 입니다!
또, 상속을 통해 기반클래스인 Person
클래스보다 더 많은 기능을 수행할 수 있고, 더 세분화되어있는 자식클래스를 만들어 줄 수 있다.
//기반클래스에서 부모클래스로 변경 됨
class Person {
//저장 프로퍼티
var name: String = ""
var age: Int = 0
//연산 프로퍼티
var introduction: String {
return "이름 : \(name). 나이 : \(age)"
}
//메서드
func speak() {
print("안녕하세요. 서근 개발노트 입니다!")
}
}
//자식클래스
class Student: Person {
enum grade:String {
case A = "통과 입니다."
case B = "재시험 입니다."
case F = "탈락 입니다."
}
func study(score: grade) {
print("\(score.rawValue)")
}
}
//부모클래스 인스턴스
let seogun: Person = Person()
seogun.name = "서근"
seogun.age = 99
print(seogun.introduction) //이름 : 서근. 나이 : 99
seogun.speak() //안녕하세요. 서근 개발노트 입니다!
//자식클래스 인스턴스
let mijin: Student = Student()
mijin.name = "미진"
mijin.age = 88
print(mijin.introduction) //이름 : 미진. 나이 : 88
mijin.speak() //안녕하세요. 서근 개발노트 입니다!
mijin.study(score: .A) //통과 입니다.
이처럼 Student
클래스가 Person
클래스를 상속받아서 Student
는 자식클래스, Person
은 부모클래스가 되어 자식클래스에서 Person
의 메서드와 저장 프로퍼티를 모두 호출할 수 있게 됐다.
더불어 Student
(자식클래스)를 상속받는 또 다른 클래스를 만들 수 있다. 즉, Student
가 다른 클래스의 부모 클래스가 될 수 있다.
// Person을 상속받은 Student를 상속받은 AnotherSutdent클래스
class AnotherStudent: Student {
var subject: String = ""
}
let cheolsu: AnotherStudent = AnotherStudent()
cheolsu.name = "철수"
cheolsu.age = 77
print(cheolsu.introduction) //이름 : 철수. 나이 : 77
cheolsu.study(score: .F) // 탈락 입니다.
읽어주셔서 감사합니다 🤟
'SWIFT > Grammar' 카테고리의 다른 글
Swift : 기초문법 [상속#3 - 클래스의 이니셜라이저 convenience, required] (0) | 2022.01.24 |
---|---|
Swift : 기초문법 [상속#2 재정의 override] (0) | 2022.01.23 |
Swift : 기초문법 [서브스크립트(subscript)] (0) | 2022.01.21 |
Swift: 기초문법 [모나드 - 컨텍스트, 함수객체, 모나드] (0) | 2022.01.20 |
Swift : 기초문법 [클로저 및 고차함수(map, filter, reduce)] (0) | 2022.01.19 |