현제의 현재이야기

[swift] 기초 문법 8일차(상속) 본문

IOS/swift

[swift] 기초 문법 8일차(상속)

현재의 현제 2022. 9. 15. 13:03

 

상속

프로토콜, 클래스에서 가능하고 열겨형, 구조체는 상속이 불가능하다.

다중상속은 불가능, 단일 상속만 가능하다.

final은 자식한테 상속했을 때, 재정의를 할 수 없게 만들어준다.

재정의가 가능한 타입 메서드 = class

하지만 class도 앞에 final이 붙으면 상속이 불가능하다. static과 똑같은 동작을 한다.

상속 받은 자식이 부모의 변수를 바꾸려면 override를 적으면 된다.

class Person {
    var name: String = ""
    func selfIntroduce() {
        print("저는 \(name)입니다")
    }
    // final 키워드를 사용하여 재정의를 방지할 수 있습니다
    final func sayHello() {
        print("hello")
    }
    // 타입 메서드
    // 재정의 불가 타입 메서드 - static
    static func typeMethod() {
        print("type method - static")
    }
    // 재정의 가능 타입 메서드 - class
    class func classMethod() {
        print("type method - class")
    }
    // 재정의 가능한 class 메서드라도
    // final 키워드를 사용하면 재정의 할 수 없습니다
    // 메서드 앞의 `static`과 `final class`는 똑같은 역할을 합니다
    final class func finalCalssMethod() {
        print("type method - final class")
    }
}
// Person을 상속받는 Student
class Student: Person {
    var major: String = ""
    override func selfIntroduce() {
        print("저는 \(name)이고, 전공은 \(major)입니다")
    }
    override class func classMethod() {
        print("overriden type method - class")
    }
    // static을 사용한 타입 메서드는 재정의 할 수 없습니다
//    override static func typeMethod() {    }
    // final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없습니다
//    override func sayHello() {    }
//    override class func finalClassMethod() {    }
}

주의: 저장 프로퍼티는 override를 할 수 없다!! 함수와 class 타입 메서드만 가능

인스턴스의 생성과 소멸

그동안 클래스를 만들었을 때, 프토퍼티의 값을 다 넣었던 이유는 인스턴스를 만들 때, 프로퍼티의 값들이 있어야 초기화가 정상적으로 이루어지기 때문이다. 그런데 초기값을 설정 안 해줄 수 있다.

class Soldier {
    var name: String
    var hp: Int
    var mp: Int
    init(name: String, hp: Int, mp: Int) {
        self.name = name
        self.hp = hp
        self.mp = mp
    }
}
let para: Soldier = Soldier(name: "attacker", hp: 100, mp: 50)
print("\(para.name), \(para.hp), \(para.mp)")

//attacker, 100, 50

프로퍼티의 초기화가 꼭 필요 없을 때

class Soldier {
    var name: String
    var hp: Int
    var mp: Int
    var trasformAble: Bool
    var needMoney : Int?
    init(name: String, hp: Int, mp: Int, transformAble: Bool, needMoney: Int) {
        self.name = name
        self.hp = hp
        self.mp = mp
        self.trasformAble = transformAble
        self.needMoney = needMoney
    }
    init(name: String, hp: Int, mp: Int, transformAble: Bool) {
        self.name = name
        self.hp = hp
        self.mp = mp
        self.trasformAble = transformAble
    }
}
let para: Soldier = Soldier(name: "attacker", hp: 100, mp: 50, transformAble: true, needMoney: 6000)
print("\(para.name), \(para.hp), \(para.mp), \(para.trasformAble), \(para.needMoney)")
//attacker, 100, 50, true, Optional(6000)

옵셔널을 ! 로 밖에 못벗기나...? 의문

'IOS > swift' 카테고리의 다른 글

[swift] 기초 문법 9일차  (0) 2022.09.16
[swift] 기초 문법 7일차(프로퍼티)  (0) 2022.09.14
[swift] 기초 문법 6일차(클로저)  (0) 2022.09.13
[swift] 기초 문법 5일차  (0) 2022.09.12
[swift] 기초 문법 4일차  (0) 2022.09.11
Comments