[Swift] Inheritance(2)

상 원·2022년 7월 18일
0

Swift

목록 보기
22/31
post-thumbnail

Overriding

쉽게 말해서 재정의임!!

슈퍼클래스에서 상속받은 인스턴스 / 타입 메소드, 인스턴스 / 타입 프로퍼티, 서브스크립트를 서브클래스 입맛에 맞게 재정의할 수가 있음.

그냥 무턱대고 서브클래스 안에다가 쓰면 안되고, override 키워드를 무조건 앞에 써 줘야 함.

일단 메소드부터 오버라이딩 하는 방법을 살펴보자!

메소드 오버라이딩

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // do nothing - an arbitrary vehicle doesn't necessarily make a noise
    }
}

일단 기본 클래스가 있고!
이걸 상속하는 Train 클래스를 만들거임.

class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}
var train = Train()
train.makeNoise()
// Prints "Choo Choo"

요런식으로 만들 수 있는데! 슈퍼클래스인 Vehicle 클래스에서의 메소드 makeNoise에 아무 동작이 없기 때문에 서브클래스에서 오버라이딩해서 원하는 작업을 할 수 있다.
물논 어떤 동작이 있는 메소드도 당연히 오버라이딩 가능함!

class KTX: Train {
    override func makeNoise() {
        print("KTX KTX")
    }
}
var ktx = KTX()
ktx.makeNoise()
// Prints "KTX KTX"

이런식으루,,

그리고 원래 있던 기능도 쓰고싶을 수 있잖아!
그럼 어떡하냐면

class KTX: Train {
    override func makeNoise() {
        print("KTX KTX")
        super.makeNoise()
    }
}
var ktx = KTX()
ktx.makeNoise()
// Prints "KTX KTX", "Choo Choo"

super 을 사용해서 슈퍼클래스에 접근할 수가 있음!!
그러면 똑같이 dot syntax를 사용해서 슈퍼클래스의 프로퍼티나 메소드에 접근할 수가 있는거임.

프로퍼티 오버라이딩

프로퍼티 오버라이딩은 쪼끔 복잡하드라..
일단 오버라이딩할 프로퍼티가 저장 프로퍼티인지 계산 프로퍼티인지 모르니까
프로퍼티 이름이랑 타입까지 다 명시를 해줘야 함!
그리구 프로퍼티 오버라이딩은 저장속성은 추가할 수 없고 계산속성만 추가할 수 있음.
추가적인 getter, setter 만 설정할 수 있다!!

그니까 만약에 저장 프로퍼티를 오버라이딩해서 그 값을 재정의할 수 없다는 뜻!

class Train: Vehicle {
    override var currentSpeed: Double = 1.5
}

이런식으로 쓸 수 없다는 것!

계산속성만 추가할 수 있다고 했는데, 요 저장 프로퍼티 currentSpeed 를 오버라이딩하려면 getter, setter 를 추가해줄 수 있음.
근데 또 특이한건! 저장 프로퍼티의 경우에는 읽기, 쓰기가 모두 가능하기 때문에 getter, setter 를 둘 다 써줘야 함. 둘 중 하나만 쓴다? 그럼 바~로 에러!

class Train: Vehicle {
    var num = 1.2
    override var currentSpeed : Double {
        get{
            self.num
        }
        set{
            self.num = newValue
        }
    }
}

요런식으로 써줘야 한다.


계산 프로퍼티의 경우에는 read-only면 getter, setter 둘 다 줄 수 있지만
read-write면 둘 중 하나라도 빼먹고 주면 오류남!

class Train: Vehicle {
	override var description: String {
    	return "overriden description"
    }
}

요런식으로 getter만 수정해 줄 수도 있고,

class Train: Vehicle {
	override var description: String {
    	get {
        	return "overriden description"
        }
    	set {
        	// setter 무언가
        }
    }
}

이런식으로 setter까지 설정해 줄 수도 있음!(사실 setter 설정하는 건 잘 몰겟삼..)

profile
ios developer

0개의 댓글