728x90
상속(Inheritance)
- class는 메소드, 프로퍼티와 다른 특징을 다른 클래스로 부터 상속할 수 있음
- Swift에서 클래스가 다른 타입과 구분되는 근본적인 요소
- 저장된 프로퍼티, 계산된 프로퍼티 상관없이 상속받은 프로퍼티에 프로퍼티 옵저버를 설정하여 값 설정에 반응
기반 클래스 정의 (Defining a Base Class)
- 다른 어떤 클래스로부터 상속받지 않은 클래스를 기반 클래스라고 함
class Bulmang {
var age = 25
var description: String {
return "bulmang's age is \\(age)"
}
func developApp() {
}
}
print("Bulmang: \\(Bulmang.age)")
// Bulmang: bulmang's age is 25
서브클래싱(Subclassing)
- 서브클래싱(상속)을 하면 부모로 부터 성격을 상속받고 자기 자신 고유 특성도 추가 가능
- 서브클래싱하여 새 클래스를 선언하는 코드는 다음과 같음
class SomeSubclass: SomeSuperclass {
// subclass definition goes here
}
// Bulmang 클래스를 상속(서브클래싱)하여 Develop클래스를 선언하면
class Develop: Bulmang {
var swift = false
}
// 인스턴스화(객체 생성)
let develop = Develop()
develop.swift = true
// 고유 속성(상속받은 부모의 속성)도 사용 가능
develop.age = 14
// 서브클래스로 생성된 클래스를 다시 서브클래싱(상속)하는 것도 가능
class Algorithm: Develop{
var levelZero: Int = 0
}
오버라이딩(Overriding)
- 서브클래스에서는 부모클래스에서 상속받은 것을 재정의 가능
- overriding 이라고 하는데,인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 모두 가능
- 오버라이드를 위해서는 다른 선언 앞에 override 키워드를 붙여줌
- Swift는 override 키워드를 보면 부모에 그 정의가 있는지 확인
부모클래스의 메소드, 프로퍼티, 서브 스크립트의 접근(Accessing Superclass Methods, Properties, and Subscripts)
- super키워드와 점문법 혹은 인덱스 구문으로 부모 클래스의 메소드, 프로퍼티, 서브스크립트에 접근
- super.someMethod, super.someProperty, super[someIndex]
메소드 오버라이드(Overriding Methods)
- 상속받은 메소드를 오버라이드 하기 위해서는 메소드 선언 앞에 override 키워드를 붙이고 내용에 적어주면 됨
class Work: Bulmang {
override func developApp() {
print("SwiftUI Application Develop")
}
}
let work = Work()
work.developApp()
프로퍼티 오버라이드 (Overriding Properties)
- 서브 클래스에서는 상속받은 저장된 프로퍼티,계산된 프로퍼티 모두 오버라이드 가능
- 오버라이드시 프로퍼티의 이름과 타입을 명시
- 상속받은 읽기전용 프로퍼티도 getter/setter를 정의하여 읽고 쓰기가 가능한 프로퍼티로 변경 가능
- 반대의 경우는 할 수 없음.
class RealAge: Bulmang {
var realAge = 24
override var description: String {
return super.description + " bulmang's real age is \\(realAge)"
}
}
var real = RealAge()
real.description
프로퍼티 옵저버 오버라이드 (Overriding Property Observers)
- 이미 부모클래스에 선언된 프로퍼티 옵저버도 서브클래스에 재정의해 사용 할 수 있음
class RealAge: Bulmang {
var realAge = 24
override var description: String {
return super.description + " bulmang's real age is \\(realAge)"
}
}
var real = RealAge()
real.description
오버라이드 방지 (Preventing Overrides)
- 서브클래스에서 특정 methods,property,subscripts가 오버라이드 되는 것을 방지하려면 final
- final로 선언되면 override를 막을 수 있음
- 클래스 전체를 final 로 선언해서 클래스 안의 메소드, 프로퍼티 등이 override가 되는 것을 막을 수 있음
class Vehicle {
final var numberOfWheels: Int {
return 4
}
final func startEngine() {
print("Starting the engine")
}
}
class Car: Vehicle {
// 오버라이드를 시도하면 컴파일 에러가 발생합니다.
// 'numberOfWheels' 프로퍼티는 'final'로 선언되어 있으므로 하위 클래스에서 오버라이드할 수 없습니다.
override var numberOfWheels: Int {
return 4
}
// 'startEngine' 메서드는 'final'로 선언되어 있으므로 하위 클래스에서 오버라이드할 수 없습니다.
// 컴파일 에러: 'startEngine()' cannot override a 'final' method
//override func startEngine() {
// print("Starting the engine of the car")
//}
}
모르는 용어
Type Property
- class, struct , enum에 속하며 타입에 대한 데이터를 저장하고 제공
- static 키워드를 사용하여 정의
- class에서는 서브클래싱(상속)
struct Car {
static var numberOfWheels = 4
var color: String
}
// 타입 프로퍼티에 접근
print(Car.numberOfWheels) // 출력값: 4
// 인스턴스 생성 후 인스턴스 프로퍼티에 접근
let myCar = Car(color: "red")
print(myCar.color) // 출력값: "red"
// 타입 프로퍼티 값 변경, 인스턴스 생성을 하지 않아도 접근 가능
Car.numberOfWheels = 2
print(Car.numberOfWheels) // 출력값: 2
서브스크립트
- 인스턴스에 대한 접근을 제공하는 단축 구문
- 인스턴스를 Array,Dictionary등과 같은 컬렉션 Type으로 사용할 수 있도록 함
- 매개변수와 반환타입을 가지는 메소드와 유사한 형태로 정의
struct MyArray {
private var storage: [Int] = []
subscript(index: Int) -> Int {
get {
return storage[index]
}
set(newValue) {
storage[index] = newValue
}
}
}
var arr = MyArray()
arr[0] = 1 // 서브스크립트를 사용하여 요소에 접근 및 값 변경
print(arr[0]) // 출력값: 1
// 서브스크립트는 index라는 매개변수를 받으며, 해당 매개변수는 배열 요소의 인덱스를 나타냄
// 서브스크립트의 반환 타입은 Int로 지정되어 있으며, get 블록에서 배열 요소에 접근하여 값을 반환하고,
// set 블록에서는 전달된 새로운 값을 해당 인덱스의 배열 요소에 할당
super
- 부모 클래스에 접근하기 위한 키워드
- 자식이 부모의 메소드, 프로퍼티등을 오버라이딩 하거나 호출할 때 super키워드를 사용
- 부모 클래스의 기능 확장
- 기존 기능을 유지후 새로운 기능 추가
- 부모 클래스의 초기화 메소드 호출
- 초기화 메소드 호출X 부모 property 초기화가 안될 수 있음
- 부모 클래스의 프로퍼티 호출
- 자식이 부모클래스의 프로퍼티에 접근 할 수 있음
프로퍼티 옵저버
- 프로퍼티의 변화를 감지하고 변화에 대응하여 특정 동작을 수행 시킴
- willSet 값이 변경 되기전에 실행
- didSet 값이 변경된 후에 실행
- oldValue는 프로퍼티 옵저버에서 이전값에 접근할 수 있도록 제공되는 상수 (didSet에서 사용)
class Academy {
var task: String {
didSet {
print("\\(oldValue)에서 \\(task)로 변경 되었음")
}
}
init(task: String) {
self.task = task
}
}
let academy = Academy(task: "MC1")
academy.task = "MC2"
// Print MC1에서 MC2로 변경 되었음
728x90
'기타 > Today I Learned' 카테고리의 다른 글
[TIL] Swift 문법 초기화(Initializer) - 2 (0) | 2023.05.11 |
---|---|
[TIL] Swift 문법 초기화(Initialization) - 1 (0) | 2023.05.10 |
[TIL] Swift 문법(Subscripts) (0) | 2023.05.03 |
[TIL] Swift 문법 메소드(Methods) (0) | 2023.04.28 |
[TIL] Swift 문법 클래스와 구조체 (0) | 2023.04.27 |