새소식

iOS/Swift

[기본문법] 상속

  • -

상속 : 부모가 자식에게 재산을 물려주는 행위

 

클래스가 다른 클래스로부터 메소드 프로퍼티 또는 다른 특성들을 상속받는것

상속받는 클래스 : 자식클래스, 서브클래스

상속하는 클래스 : 부모클래스, 슈퍼클래스


코드로 확인

 

상속

 

상속받은 서브클래스는 부모클래스로 부터 물려받은 메소드 프로퍼티 서브스크립트를 호출하거나 접근할 수 있다

import UIKit

//슈퍼클래스
class Vehicle {
    var currentSpeed = 0.0
    var description: String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise(){
    }
}

//상속
/*
 class 클래스이름: 부모클래스이름 {
  //하위클래스 정의
 }
 */

//서브클래스
class Bicycle: Vehicle {
    var hasBasket = false
}

var bicycle = Bicycle()
bicycle.currentSpeed     // 0
bicycle.currentSpeed = 15.0
bicycle.currentSpeed     // 15

 

오버라이딩

 

서브클래스는 override 키워드를 사용하여 슈퍼클래스에서 정의된 메소드, 프로퍼티, 서브스크립트 등을 자신만의 내용으로 재정의 할 수 있다.

  • 만약 같은 이름의 정의가 슈퍼클래스에 없는데 오버라이드키워드를 사용하면 컴파일러 오류가 난다
  • 슈퍼클래스에 동일한 이름의 정의가 있는데 오버라이드키워드를 사용하지 않으면 컴파일러 오류가 난다

함수 오버라이딩

import UIKit

//슈퍼클래스
class Vehicle {
    var currentSpeed = 0.0
    var description: String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise(){
    }
}

//서브클래스
class Train: Vehicle{
    override func makeNoise() {     //오버라이딩
        print("choo choo")
    }
}

let train = Train()
train.makeNoise()




----------------------------------------
choo choo

 

 

키워드 super

import UIKit

//슈퍼클래스
class Vehicle {
    var currentSpeed = 0.0
    var description: String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise(){
        print("speaker on")
    }
}


//서브클래스
class Train: Vehicle{
    override func makeNoise() {  
        super.makeNoise()         //super 키워드 사용으로 슈퍼클래스의 함수 먼저 호출
        print("choo choo")
    }
}

let train = Train()
train.makeNoise()



-------------------------------------------------
speaker on
choo choo

 

프로퍼티 오버라이딩

import UIKit

//슈퍼클래스
class Vehicle {
    var currentSpeed = 0.0
    var description: String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise(){
        print("speaker on")
    }
}


//서브클래스
class Car: Vehicle{
    var gear = 1
    override var description: String {                  //프로퍼티 오버라이딩
        return super.description + " in gear \(gear)"    
    }
}

let car = Car()
car.currentSpeed = 30.0
car.gear = 2
print(car.description)



---------------------------------------------------
traveling at 30.0 miles per hour in gear 2

 

 

 

프로퍼티 옵저버

import UIKit

//슈퍼클래스
class Vehicle {
    var currentSpeed = 0.0
    var description: String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise(){
        print("speaker on")
    }
}


//서브클래스
class Car: Vehicle{
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}


//서브클래스

class AutomaticCar: Car{
    override var currentSpeed: Double {
        didSet {                                 //프로퍼티옵저버, currentSpeed값이 변하면 gear 리턴
            gear = Int(currentSpeed / 10) + 1
        }
    }
}

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")



-------------------------------------------------------------
AutomaticCar: traveling at 35.0 miles per hour in gear 4

 

 

 

 

더해서 

 

  • 계산 프로퍼티와 저장프로퍼티를 오버라이딩한 프로퍼티는 getter, setter를 가질 수 있다
  • 자식클래스에서 재정의하려는 프로퍼티는 슈퍼클래스의 프로퍼티의 이름과 타입이 일치해야 한다
  • 슈퍼클래스에서 read-write로 선언된 프로퍼티를 서브클래스에서 read-only로 정의 할 수 없지만
  • 슈퍼클래스에서 read-only로 선언된프로퍼티를 서브클래스에서 read-write로 정의 할 수 있다.
  • 상속된 프로퍼티에 프로퍼티 옵저버를 추가할 때 상수저장프로퍼티나 read-only연산프로퍼티는 값을 재설정할 수 없기 때문에 프로퍼티옵저버를 추가할 수 없다.
  • 메서드, 프로퍼티 등을 오버라이딩하지 못하게 하려면 키워드 앞에 final 키워드를 작성해주면 된다.
  • final키워드가 사용되서 정의된 요소를 오버라이딩 시도하면 컴파일러 오류가 난다.

글의 모든 내용은 패스트캠퍼스 강의를 시청하고 작성한 내용입니다.

End

 

'iOS > Swift' 카테고리의 다른 글

[기본문법]assert와 guard  (0) 2022.12.21
[기본문법]타입캐스팅  (0) 2022.12.21
[기본문법]클래스와 구조체 비교  (0) 2022.12.14
[기본문법] 프로퍼티  (0) 2022.10.28
[기본문법]초기화 구문 init  (0) 2022.10.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.