SMALL
* 클래스 - 상속 개념 *
상속의 개념과 키워드
상속
Swift에서 상속(Inheritance)은 클래스(Class) 간에 코드 및 속성을 공유하는 메커니즘을 제공
상속은 기존 클래스에서 새로운 클래스를 만들고, 기존 클래스의 특성(속성과 메서드)을 재사용하면서
새로운 기능을 추가할 수 있도록 해줌 (서브 클래싱).
[ 상속 사용의 장점 ]
코드 재사용성
기존 클래스의 특성을 재사용하여 중복을 피하고 유지보수성을 높임
계층 구조
부모 클래스와 이를 상속받는 자식 클래스 간에 계층 구조를 형성하여
다양한 수준의 추상화와 분류를 가능하게 해줌
override
override 키워드는 부모 클래스에서 상속받은 메서드,
속성 또는 서브스크립트를 자식 클래스에서 다시 정의할 때 사용
자식 클래스에서 부모 클래스의 메서드를 재정의하여 새로운 구현을 제공
메서드, 속성, 서브스크립트를 재정의하기 위해서는 override 키워드를 사용해야 합니다.
super
super 키워드는 자식 클래스에서 부모 클래스의 메서드,
속성 또는 초기화 메서드를 호출할 때 사용
부모 클래스의 메서드를 호출하거나 부모 클래스의 초기화 메서드를 호출하는 데 사용
super.method() 또는 **super.property**와 같이 사용하여 부모 클래스의 기능을 호출
final
final 키워드는 클래스, 메서드, 속성 또는 서브스크립트를 표시하여 상속이 불가능하도록 만듦
final 키워드가 클래스에 사용되면 해당 클래스는 상속 불가
메서드, 속성, 서브스크립트에 사용될 경우, 해당 멤버들을 재정의(Override) 불가
// 상속의 예시
// 부모 클래스(Person) 선언
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func greet() {
print("Hello, my name is \(name).")
}
}
// Person 클래스를 상속받는 자식 클래스(Student) 선언
class Student: Person {
var studentID: Int
/*
init을 정의 해줄 때 studentID 뿐만 아니라 name도 age도 같이 필요합니다.
이유는 self.studentID = studentID 이것만 필요할 줄 알았지만 Person 즉, 상속을 해버렸기 때문에
부모의 것 까지도 다 넣어주어야 하는 것 입니다. 그렇지않으면 변수로 정의 해줬던 name와 age가
세틴이 되지 않습니다.. 때문에 super.init도 불러주어 3개의 프로퍼티의 값을 넣어주어야 한 것입니다.
super를 붙이므로써 부모를 가르킬 수 있는 것입니다. 즉, 위 코드 self로 정의된 부모의 것들을 호출할 수
있는 것입니다.
*/
init(name: String, age: Int, studentID: Int) {
self.studentID = studentID
super.init(name: name, age: age)
} // 이런식으로 초기화 해주면 됩니다.
func study() {
print("\(name) is studying.") // 부모(가장 위)에 있는 name을 불러와서 세팅해주는 것 입니다.
}
}
// Student 클래스 인스턴스 생성 및 사용
let john = Student(name: "John", age: 20, studentID: 123)
john.greet() // 출력: Hello, my name is John.
john.study() // 출력: John is studying.
// override, super 키워드 예시
/*
makeSound 라는 함수를 만들고, 프린트해줍시다. Animal이라는 클래스로 정의가 되어있고
Dog는 Animal을 상속하고 있으며, makeSound라는 함수를 override 하고 있습니다.
함수의 이름이 같은것을 확인 할 수 있는데 이럴 때 출력문에서 Some generic sound 가 싫다면
재정의를 하겠다는 의미에서 override를 붙여서 다시 정의를 해주시면 됩니다.
*/
class Animal {
func makeSound() {
print("Some generic sound")
}
}
class Dog: Animal {
override func makeSound() {
super.makeSound() // 부모 클래스의 메서드 호출
print("Bark!")
}
}
let dog = Dog() // 출력: Some generic sound
dog.makeSound() // 출력: Bark!
// final 키워드 예시
/*
보면 final이 3개가 들어가 있는것이 보입니다. 클래스, 프로퍼티, 메서드에 모두 앞에 붙어 있는데
클래스에 붙어있는경우엔 상속을 했을 때 에러가 뜰 수밖에 없습니다. 하지만 클래스에 final이 안붙는다면
다음단 프로퍼티와 그 다음단에 메서드를 오버라이드가 불가능합니다.
*/
final class Vehicle {
final var wheels: Int = 0
final func makeSound() {
print("Some generic sound")
}
}
// Error: 'SubVehicle' cannot inherit from final class 'Vehicle'
class SubVehicle: Vehicle {
// Error: 'wheels' cannot override 'final' var from superclass
// override var wheels: Int = 4
// Error: 'makeSound()' cannot override a final method
// override func makeSound() {
// print("Custom sound")
// }
}
728x90
'IOS > Swift-Study' 카테고리의 다른 글
[Swift-Study] 심화 문법종합반 2주차 1일차 정리 - 프로퍼티 옵저버 (0) | 2024.03.12 |
---|---|
[Swift-Study] 기초 문법종합반 1주차 4일차 정리 - 초기화 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 3일차 정리 - 클래스, 구조체, 열거형 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 3일차 정리 - 객체 지향 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 2일차 정리 - 배열, 세트, 딕셔너리 (0) | 2024.03.12 |