본문 바로가기

DEV/Swift

[Swift] Inheritance (상속)

클래스, 프로토콜 등은 상속이 가능함.

클래스 2개를 연결, 부모클래스와 자식클래스 이용.

/* 프로퍼티 */
//클래스를 예로 프로퍼티를 설정해봄.
class Person {
    //저장 프로퍼티: 흔히 아는 변수 선언 방법.
    var name:String = ""
    //미리 자원을 소비하여 계산할 필요가 없을 때는 lazy사용.
    //구조체에서는 이 저장프로퍼티를 연산프로퍼티에서 get 할 때는 mutating해줘야 함.
    lazy var westernAge:Int = 0

    //연산 프로퍼티: get과 set을 사용
    var koreanAge:Int {
        get {
            return westernAge + 1
        }
        set(inputValue) {
            westernAge = inputValue - 1
        }}

    //읽기전용 인스턴스 연산 프로퍼티
    var greeting:String {
        get {
            return "Hello, my name is \(self.name)"
        }}
    
    //타입 프로퍼티: 구조체나 클래스 전체를 메모리에 할당하지 않고 사용할 때
    //타입 프로퍼티는 특정 타입에 속한 프로퍼티로, 그 타입에 단 하나의 프로퍼티만 생성됨.
    //인스턴스와는 다르게 타입은 항상 초기값을 지정(이니셜라이저가 없기 때문)
    static var msg:Int { return 5 }
    //class로 선언되는 타입프로퍼티는 클래스에서만 사용가능하고, 오버라이딩이 가능함.
    class var overidableMsg:Int { return 6 }
    
    //프로퍼티 감시자(옵저버)
    //프로퍼티에 새 값이 설정(set)될 때마다 이벤트를 감지하는 기능.
    //새 값이 이전값과 같은 값이라도 호출됨.
    //lazy에서는 사용될 수 없음.
    //willSet(값 바뀌기 전), didSet(값 바뀐 후)
    //willSet에서 파라메터 지정 가능. (기본:newValue)
    //didSet역시 파라메터 가짐. (기본:oldValue)
    var score:Int = 0 {
        willSet(newScore) {
            print("Score Changing: \(score) to \(newScore)")
        }
        didSet {
            if(score > oldValue) {
                print("Upgrade your Score: \(score - oldValue)")
            }
        }
    }
}

//프로퍼티의 사용
var james:Person = Person() //프로퍼티가 저장된 구조체 생성
james.name = "James"
james.westernAge = 32
print(james.greeting)
print("My Korean Age is \(james.koreanAge)")
print(Person.msg)   //타입 프로퍼티는 인스턴스 생성 없이 바로 구조체/클래스명으로 접근
james.score = 65
james.score = 77