스위프트 상속(Inheritance)
상속은 클래스, 프로토콜 등에서 가능하다.
열거형, 구조체는 상속이 불가능하다.
스위프트의 클래스는 단일 상속으로, 다중 상속을 지원하지 않는다.
프로토콜의 경우 여러개를 채택할 수 있다.
상속하는 클래스는 하위클래스(subclass), 상속받은 클래스는 슈퍼클래스(superclass) 로 알려져있다.
이번에는 클래스의 상속에 대해서 공부할 예정이다.
클래스에서 상속은 다음과 같이 사용할 수 있다.
class 이름: 상속받을 클래스 이름 {
구현부
}
클래스를 정의한 후 변수나 상수에 타입을 정해줄 때 처럼 상속을 해줄 수 있다.
예를 들어, 상속할 상위 클래스를 만들어 보았다.
class Person {
var name: String = ""
func selfIntroduce() {
print("저는 \(name) 입니다.")
}
// final 키워드를 사용하여 재정의를 방지할 수 있다.
final func sayHello() {
print("Hello !!!")
}
// 타입 메서드
// 재정의 불가 타입 메서드 - static
static func typeMethod() {
print("Person type method - static")
}
// 재정의 가능 타입 메서드 - class
class func classMethod() {
print("Person type method - class")
}
// 재정의 가능한 class 메서드라도
// final 키워드를 사용하면 재정의 할 수 없다.
// 메서드 앞의 static 과 final class 는 똑같은 역할을 한다.
final class func finalCalssMethod() {
print("Person type method - final class")
}
}
Person 이라는 클래스를 생성하고 변수와 각 함수들을 만들어주었다.
final 키워드를 사용하면 상속받은 클래스에서의 재정의를 방지해준다. 간단하게 수정할 수 없게 한다는 것이다.
static 키워드를 사용하면 재정의가 불가능하다.
재정의가 가능한 class 메서드라고 해도 앞에 final 키워드를 사용하면 재정의를 할 수 없다.
static 과 final class 는 똑같은 역할을 하는 것을 알 수 있다.
그럼 위의 Person 클래스를 상속 받을 하나의 클래스를 생성해보았다.
// Person 을 상속받는 Student
class Student: Person {
var major: String = ""
override func selfIntroduce() {
print("저는 \(name) 이고, 전공은 \(major) 입니다.")
}
override class func classMethod() {
print("Student overriden type method - class")
}
// override func sayHello() {
// print("hihihihi")
// }
}
변수에 타입을 정해줄 때와 같이 Student 라는 클래스를 생성하고 Person 클래스를 상속해주었다.
그리고 변수를 생성하고 상속받은 Person 클래스 내부에 있는 메서드를 상속받아 재정의한 것을 볼 수 있다.
Person 이라는 클래스에서 static 이나 final class 로 재정의를 할 수 없는 메서드를 상속받으려고 하면 다음과 같은 에러가 발생한다.
위와 같이 final 인스턴스 메서드를 오버라이드 할 수 없다고 나온다.
잠깐, 오버라이딩과 오버로딩에 대해서 간단하게 짚고 넘어가야겠다.
오버로딩(Overloading)
같은 이름의 함수를 여러 개 정의하고 매개 변수를 다르게 해 다양한 유형의 호출에 응답이 가능하게 한다.
오버라이딩(Overriding)
상속 관계에 있는 클래스의 이미 정의된 메서드를 재정의 해 특정한 형태로 구현 가능하다.
그럼 이제 Person 클래스와 Person 클래스를 상속받은 Student 클래스를 사용해보자.
let jay: Person = Person()
let su: Student = Student()
이렇게 각 클래스 타입으로 상수 2개를 만들어보았다.
// Person 내 변수 name 설정
jay.name = "jay"
// Student 내 변수 name, major 설정
su.name = "su"
su.major = "Swift"
// 각 클래스의 메서드를 호출하는 것을 확인 할 수 있다.
jay.selfIntroduce()
// 저는 jay 입니다.
su.selfIntroduce()
// 저는 su 이고, 전공은 Swift 입니다.
Person.classMethod()
// Person type method - class
Person.typeMethod()
// Person type method - static
Person.finalCalssMethod()
// Person type method - final class
Student.classMethod()
// Student overriden type method - class
Student.typeMethod()
// Person type method - static
Student.finalCalssMethod()
// Person type method - final class
각 클래스 타입을 정의했기 때문에 각자의 변수를 설정해준다.
그리고 Student 클래스에서 오버라이딩을 통해 재정의 했기 때문에
selfIntroduce() 메서드의 출력 결과가 다르게 나오는 것을 확인할 수 있다.
그리고 final 키워드와 static class 키워드를 사용하면 재정의가 불가능하지만
Student 클래스에서 상속받아 호출은 할 수 있기 때문에 위에서 확인한 것과 같이 출력할 수 있다.
상속에 대해서는 Java를 공부하면서 상속에 대해서 어느 정도는 이해가 있어서
스위프트의 상속에 대해 공부할 때도 별 다른 점은 없어 보여서 쉽게 이해할 수 있었던 것 같다.
- 참고 사이트 -
www.edwith.org/boostcamp_ios/lecture/11309
dev200ok.blogspot.com/2020/03/overloading-overriding.html
'iOS > Swift' 카테고리의 다른 글
[Swift] 21. 옵셔널 체이닝과 nil 병합 (0) | 2020.11.18 |
---|---|
[Swift] 20. 인스턴스 생성 및 소멸 (init / deinit) (0) | 2020.11.11 |
[Swift] 18. 프로퍼티 (Property) - 추가적인 보완 필요 (0) | 2020.11.05 |
[Swift] 17. 클로저(closure) 고급 (0) | 2020.11.03 |
[Swift] 16. 클로저(closure) 기본 (0) | 2020.11.02 |