관리 메뉴

김종권의 iOS 앱 개발 알아가기

[swift] 9. 상속 및 다운캐스팅 본문

swift 5 문법

[swift] 9. 상속 및 다운캐스팅

jake-kim 2020. 3. 28. 18:47

1. 특성

 - 단일 상속만 지원

  ※ protocol은 다중 구현 가능

1
2
3
4
5
6
7
8
import UIKit
class C1{
    
}
 
class C2: C1, UIContentContainer, UIAppearanceContainer{ // 다중 구현한 protocol과 단일 상속한 C1구별 
}
 
 
 

2. 오버라이딩

 - override키워드 붙임

 - 메서드 뿐만 아니라 연산프로퍼티 변수 또한 오버라이딩 가능

 - 수정 할 수 있는 변수로 하려면 역시, set키워드 넣을 것

 - didSet, willSet이용 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import UIKit
 
class Machine{
    var name: String = ""
    var age: Int {
        return 10
    }
    
    final var hi: Int = 1 // cannot override in subclass
}
 
class Car: Machine {
    
    override var name: String { // faild - name is only read
        return "car"
    }
    
    override var age: Int// success
        return 120
    }
}
 

 

 

 

 

 

- 초기화 구문의 오버라이딩 : 서브클래스에서 수퍼클래스의 init을 super로 초기화해야함

    ※  "Initializer Delegation" : 단, 기본초기화 구문 init() 혹은 생략 되어 있으면 서브클래스 init에서 super.init으로 수퍼클래스 init을 연속적으로 실행해 주어야함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import UIKit
 
class A{
    var value: Int
    init(input: Int){
        self.value = input
    }
}
 
class B:A{
    override init(input: Int){ // 매개변수 이름도 수퍼클래스와 동일해야함
        super.init(input: 10// 이게 없다면 A클래스의 value를 초기화할 것이 없어서 오류발생
    }
}
 
let b: B = B(input: 123)
 
 
 

3. 타입 캐스팅

 - 타입 캐스팅이 필요한 이유 : 서브 클래스는 자기 자신의 타입이면서도 동시에 수퍼 클래스의 타입이기도 함

                                              상위클래스 타입으로 서브클래스들의 인스턴스를 받아도, 캐스팅하면 서브클래스 프로퍼티 이용가능

1
2
3
var list = [Person]()
list.append(Lee()) // list[0]에서 Lee의 메서드 사용하려면 다운캐스팅 필요
 
 

- 연산자 타입 확인 방법 : 왼쪽 인스턴스, 오른쪽 타입

1
2
3
Lee() is Lee // true
Lee() is Person // true
Person is Lee // false
 

 

- 다운캐스팅 : 선언은 수퍼클래스, 인스턴스는 서브클래스 형태 일 때, 두 가지 방법으로 캐스팅

   다운캐스팅에서 오류가 발생하면 nil을 반환하므로 ?와!관련된 캐스팅만 존재

   as?(결과는 옵셔널 타입), as!(결과는 일반 타입) 두 가지 방법 존재 (업 캐스팅은 as만 존재)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import UIKit
 
class A{
}
 
class B:A{
    var name: String = "b"
}
 
let b: A = B()
b.name  // error
 
if let bb = b as? B {
    bb.name // success
}
 
 

4. AnyObject, Any

 - AnyObject는 모든 클래스 타입의 수퍼클래스

 - Any는 클래쓰 뿐만이 아닌 다른 자료형도 해당

 

 

Comments