[다양한 표현 및 확장] 9. 상속

Seoyoung Lee·2022년 2월 24일
0


2021년 12월 27일에 공부한 내용입니다.

1. 스위프트 상속

  • 상속은 클래스, 프로토콜 등에서 가능하다.
  • 열거형, 구조체는 상속이 불가능하다.
  • 스위프트의 클래스는 단일상속으로, 다중상속을 지원하지 않는다.

2. 문법

class 이름: 상속받을 클래스 이름 {
    /* 구현부 */
}

3. 사용

  • final: 재정의(오버라이드)를 방지할 수 있다.
  • static 키워드를 사용해 타입 메서드를 만들면 재정의가 불가능하다.
  • class 키워드를 사용해 타입 메서드를 만들면 재정의가 가능하다.
  • class 앞에 final을 붙이면 static 키워드를 사용한 것과 동일하게 동작한다.
  • override 키워드를 사용해 부모 클래스의 메서드를 재정의 할 수 있다.
// 기반 클래스 Person
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 name: String = ""
    // name을 상속받기 때문에 다시 name 변수를 정의하면 오류가 발생한다.
    // 저장 프로퍼티는 오버라이딩 불가능
    var major: String = ""

    override func selfIntroduce() {
        print("저는 \(name)이고, 전공은 \(major)입니다")
        super.selfIntroduce() // 부모 클래스의 메서드 호출
    }

    override class func classMethod() {
        print("overriden type method - class")
    }

    // static을 사용한 타입 메서드는 재정의 할 수 없다
    override static func typeMethod() {} // error

    // final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없다
    override func sayHello() { } // error
    override class func finalClassMethod() {} // error
}

let seoyoung: Person = Person()
let beomgyu: Student = Student()

seoyoung.name = "seoyoung"
beomgyu.name = "beomgyu"
beomgyu.major = "Swift"
seoyoung.major // error

seoyoung.selfIntroduce()
// 저는 seoyoung입니다

beomgyu.selfIntroduce()
// 저는 beomgyu이고, 전공은 Swift입니다

Person.classMethod()
// type method - class

Person.typeMethod()
// type method - static

Person.finalClassMethod()
// type method - final class

Student.classMethod()
// overriden type method - class

Student.typeMethod()
// type method - static

Student.finalClassMethod()
// type method - final class
profile
나의 내일은 파래 🐳

0개의 댓글