λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍏 Today I Learned/Swift 문법

[Swift] 상속

by Joseph Seong 2023. 12. 7.

 

 

상속

 

μƒμ†μ˜ κ°œλ…κ³Ό ν‚€μ›Œλ“œ

 

  • Swiftμ—μ„œ 상속(Inheritance)은 클래슀(Class) 간에 μ½”λ“œ 및 속성을 κ³΅μœ ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•œλ‹€.
  • 상속은 κΈ°μ‘΄ ν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€κ³ , κΈ°μ‘΄ 클래슀의 νŠΉμ„±(속성과 λ©”μ„œλ“œ)을 μž¬μ‚¬μš©ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€(μ„œλΈŒ ν΄λž˜μ‹±).
  • μž₯점
    1. μ½”λ“œ μž¬μ‚¬μš©μ„±: κΈ°μ‘΄ 클래슀의 νŠΉμ„±μ„ μž¬μ‚¬μš©ν•˜μ—¬ 쀑볡을 ν”Όν•˜κ³  μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆλ‹€.
    2. 계측 ꡬ쑰: λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ 이λ₯Ό μƒμ†λ°›λŠ” μžμ‹ 클래슀 간에 계측 ꡬ쑰λ₯Ό ν˜•μ„±ν•˜μ—¬ λ‹€μ–‘ν•œ μˆ˜μ€€μ˜ 좔상화와 λΆ„λ₯˜λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.
  • ν‚€μ›Œλ“œ
    • override
      • λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 상속받은 λ©”μ„œλ“œ, 속성 λ˜λŠ” μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μ •μ˜ν•  λ•Œ μ‚¬μš©λœλ‹€.
      • μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ μƒˆλ‘œμš΄ κ΅¬ν˜„μ„ μ œκ³΅ν•  수 μžˆλ‹€.
      • λ©”μ„œλ“œ, 속성, μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μž¬μ •μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” override ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    • super
      • μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œ, 속성 λ˜λŠ” μ΄ˆκΈ°ν™” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λœλ‹€.
      • λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ λΆ€λͺ¨ 클래슀의 μ΄ˆκΈ°ν™” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
      • super.method() λ˜λŠ” **super.property**와 같이 μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀의 κΈ°λŠ₯을 ν˜ΈμΆœν•  수 μžˆλ‹€.
    • final
      • 클래슀, λ©”μ„œλ“œ, 속성 λ˜λŠ” μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό ν‘œμ‹œν•˜μ—¬ 상속이 λΆˆκ°€λŠ₯ν•˜λ„λ‘ λ§Œλ“ λ‹€.
      • final ν‚€μ›Œλ“œκ°€ ν΄λž˜μŠ€μ— μ‚¬μš©λ˜λ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” 상속될 수 μ—†λ‹€.
      • λ©”μ„œλ“œ, 속성, μ„œλΈŒμŠ€ν¬λ¦½νŠΈμ— μ‚¬μš©λ  경우, ν•΄λ‹Ή 멀버듀을 μž¬μ •μ˜(Override)ν•  수 μ—†λ‹€.
// λΆ€λͺ¨ 클래슀(Person) μ„ μ–Έ
class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func greet() {
        print("Hello, my name is \(name).")
    }
}

// Person 클래슀λ₯Ό μƒμ†λ°›λŠ” μžμ‹ 클래슀(Student) μ„ μ–Έ
class Student: Person {
    var studentID: Int

    init(name: String, age: Int, studentID: Int) {
        self.studentID = studentID
        super.init(name: name, age: age)
    }

    func study() {
        print("\(name) is studying.")
    }
}

// Student 클래슀 μΈμŠ€ν„΄μŠ€ 생성 및 μ‚¬μš©
let john = Student(name: "John", age: 20, studentID: 123)
john.greet() // 좜λ ₯: Hello, my name is John.
john.study() // 좜λ ₯: John is studying.



// override, super ν‚€μ›Œλ“œ μ˜ˆμ‹œ

class Animal {
    func makeSound() {
        print("Some generic sound")
    }
}

class Dog: Animal {
    override func makeSound() {
        super.makeSound() // λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œ 호좜
        print("Bark!")
    }
}

let dog = Dog()
dog.makeSound()


// final ν‚€μ›Œλ“œ μ˜ˆμ‹œ

final class Vehicle {
    final var wheels: Int = 0
    
    final func makeSound() {
        print("Some generic sound")
    }
}

// Error: 'SubVehicle' cannot inherit from final class 'Vehicle' (class에 final을 뢙이면 μ•ˆλœλ‹€.)
class SubVehicle: Vehicle {
    // Error: 'wheels' cannot override 'final' var from superclass
    // override var wheels: Int = 4
    
    // Error: 'makeSound()' cannot override a final method
    // override func makeSound() {
    //     print("Custom sound")
    // }
}