이번에는 스위프트에서 상속이라는 개념에 대해서 공부해보려고 합니다!

java를 공부하면서 상속이라는 개념을 처음 배웠는데, swift에서는 상속이 어떻게 쓰이는지 알아보겠습니다!

그래서 상속의 의미는 뭔데요??

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

이렇게만 봐서는 무슨 소리인지 모르겠네요..

swift에서의 상속이란 ??

클래스가 다른 클래스로부터 메서드, 프로퍼티 혹은 다른 특성들을 상속받는 것을 말합니다!

상속하는 클래스를 부모 클래스 (superclass)

상속받는 클래스를 자식 클래스 (subclass)

상속은 스위프트의 다른 타입과 구별짓는 클래스만의 특징입니다.

스위프트의 부모클래스부터 물려받은 것(메서드, 프로퍼티 등)을 호출하거나 접근 가능!

또한 오버라이딩을 통해 물려받은 것들을 재정의가 가능합니다.

또한 상속받은 프로퍼티의 값을 변경되었을 때 알려주는 프로퍼티 감시자도 구현이 가능합니다.

그러면 코드로 살펴보겠습니다!

먼저 위와 같은 형태로 클래스의 정의가 가능합니다.

먼저 부모가 될 클래스가 존재해야합니다.

Vehicle 이라는 클래스를 만들어 주었고

거기에 변수 2가지를 넣어주었습니다!

그러면 상속받을 자식이 존재해야겠죠?

Bicycle 이라는 클래스를 생성하고 그 옆에 부모로 지정할 클래스 즉 Vehicle을 적어주었습니다.

이렇게 지정을 해주면 상속을 받을 수 있는 것이죠!

그러니까 Vehicle에 정의해둔 것들을 Bicycle에서도 불러올 수 있는 것입니다.

Vehicle에서 선언해 둔 currentSpeed가 Bicycle클래스에서도 선언이 되고 출력이 되는 것을 확인할 수 있습니다!

그러면 값을 변경해볼까요?

부모 클래스에 있는 값도 변경이 가능한 것을 확인할 수 있습니다!

이렇게 상속을 받게 된다면

Bicycle의 프로퍼티는 딱히 없는 것 처럼 보일 수도 있지만 Vehicle의 프로퍼티와 메서드를 다 가집니다!


override

subclass는 superclass에서 정의된 것들을 자신만의 기능으로 변경하여 사용할 수 있습니다.

이렇게 변경하여 사용하는 것을 오버라이딩이라고 합니다.

간단한 예시입니다.

위에 Vehicle에 함수 makeNoise를 선언해두었습니다.

Train이라는 Vehicle을 부모클래스로 가지는 자식클래스를 선언하였습니다.

override를 사용해서 makeNoise 함수를 변경하였습니다.

noise noise라는 구문이 출력되게요.

train이라는 상수를 선언해준 후

makeNoise를 호출하면

noise noise가 호출되는 것을 확인할 수 있습니다.


만약 부모클래스의 특성을 활용하고 싶다면 어떻게 해야할까요!?

super를 활용하는 것입니다.

먼저 부모클래스에 아무것도 없던 makeNoise 함수에

speaker is on.이 출력되게 만들어줍니다.

그 후

super.makeNoise()로 호출을 해주면 부모클래스에 있는 Vehicle의 함수 makeNoise가 불러오는 것입니다.

네 위와 같이 부모 클래스의 speaker is on이 호출 된 후

자식 클래스의 noise noise가 호출되는 것을 확인할 수 있습니다.


프로퍼티를 오버라이딩하는 방법!

프로퍼티를 재정의한다는 것은 프로퍼티의 게터 세터 옵저버 등을 재정의하는 것을 의미합니다!

먼저 Car라는 클래스를 정의하였고 부모클래스로는 Vehicle을 가져왔습니다.

위에 부모클래스에는 var description이라는 프로퍼티를 선언해두었습니다.

그 프로퍼티를 재정의하려면 override var description으로 선언을 해주고

return 값으로 super.재정의하려는 프로퍼티(description)을 해주면 됩니다.

그 후 아래에서 값을 정의 후 선언하니 위와 같이 출력이 되는 것을 확인할 수 있습니다.

위와 같이!

슈퍼클래스에 있는 프로퍼티도 재정의가 가능합니다.


상속된 프로퍼티에 오버라이드를 사용해서 프로퍼티 옵저버도 추가가 가능합니다!

코드로 살펴보겠습니다!

프로퍼티 재정의를 통해 프로퍼티(currentSpeed)의 값이 변경되면 옵저버를 통해서 gear 프로퍼티의 값을 변경해서 사용할 수 있습니다.

상속된 프로퍼티의 오버라이드를 사용하면 프로퍼티 옵저버를 추가할 때는 상수 저장 프로퍼티, read only 프로퍼티에는 프로퍼티 옵저버를 추가할 수 없습니다.

그 이유는 상수저장 프로퍼티나, read only 프로퍼티는 값을 설정할 수 없기 때문에 willSet, didSet을 사용할 수 없기 때문입니다.

키워드 앞에 final을 사용하면 override를 할 수 없게 만들 수 있습니다!

만약 currentSpeed에 final로 선언을 해준다면

상속을 받을 수 없다는 오류가 나오게 됩니다!

또한 클래스 앞에도 final을 선언해준다면 상속이 불가능한 클래스를 만들 수 있습니다!

여기까지 상속에 대해서 간단하게 배워봤습니다

+ Recent posts