Swift

Swift | class(클래스)와 struct(구조체)에 관하여 - 상속(inheritance)과 재정의(overriding vs overloading)

ziziDev 2024. 5. 16. 16:45
반응형

안녕하세요!

오늘은 상속에 대해서 알아보고자 합니다

 

상속이란 말 그대로 

클래스가 다른 클래스에게 무언가 남겨줄 수 있는

유산 같은거라고 생각하시면 됩니다

 

상속은 부모가 자식에게 물려받는 것을 의미하는데

이걸 코드에도 적용이 됩니다

 

상속

(Inheritance)

 

한 클래스가 다른 클래스에서 정의된 프로퍼티나 메서드를 물려받아 사용하는 것

 

(구조체❌클래스🙆🏻‍♀️)

 

only class

에서만 사용이 가능한 기능

 

게임에서 정말 많이 사용했던 아이이기 때문에 낯설지가 않은데요

스위프트에서 예제로 알아봅시다

 

 

클래스를 하나 우선 만들어주고

이제 자식에게 상속을 해보고자 합니다

 

상속의 형태는

 

class 클래스명: 부모 클래스 이름 {

...구현 부분 ....

}

 

로 되어있답니다

 

 

코드로 구현하자면 이렇게 구현할 수가 있답니다

 

이렇게 정의하고 인스턴스화 해본 후 호출해보도록 합시다

 

 

description은 재정의하였습니다

아예 다르게 나오는걸 확인할 수 있답니다

 

b를 인스턴스화 한 후 name 값도 변경해서 description에 있는 name  변수도

다르게 나오는걸 확인할 수 있답니다

:)

 

상속은 데이터가 하나씩 추가된다고 생각하면 됩니다

 

상위 클래스에서 멤버를 변형하는것은 재정의이며

저장속성은 자식 클래스에서 재정의가 불가능!! 하다는점

 

상속의 기본을 배웠다면

재정의에 대해서 알아보고자 합니다

 

재정의

|

오버라이딩

(overriding)

 

자식 클래스는 기본적으로 부모 클래스를 상속 받은 클래스랍니다

부모의 메서드를 그대로 사용하지만 다시 구현하거나 재정의 + 다시 구현의 경우로도 사용을 합니다

 

이렇게 자식 클래스에서 부모 클래스에서 물려 받은걸

활용 하는걸 오버라이딩이라고 합니다

 

모두가 재정의를 할 수 있진 않습니다

저장속성은 재정의가

🚫불가능🚫

합니다

 

이제

속성과 메서드 재정의 하는 방식에 대해서 

알아봅시다

 

 

 

우선 A 클래스를 만들어 주고

자식클래스 B를 만들어 준 후

name에 대한 속성을 재정의를 하고자 합니다

 

우리는 단순히

 override var name: String = "Bclass"

이렇게 하면 가능하지 않을까?

라고 생각하지만

 

안됩니다

 

 

재차 강조하지만 저장속성은 재정의가 불가능합니다

그럼 변수는 어떤식으로 재정의해야하는건데~!!??

 

계산속성

으로 가능하답니다 :)

여기서 유의할 점은

self.으로 접근할 수 없답니다

부모 클래스에 접근하기 때문에

 

super 키워드 + .을 사용하여 접근해야합니다

 

set은 앞에서 배웠다시피

set(매개변수) { super.name = 매개변수 }

를 사용할 수 있지만

 

newValue 매개변수를 제공해주고 있답니다

 

그리고 메서드 재정의에 대해서 알아봅시다

 

메서드에서

super.className() 부모 메서드를 호출하지 않으면

새롭게 작성한 코드만 출력이 됩니다

 

하지만

부모 함수를 호출하게 된다면??

 

 

 

여기서 또 자식 클래스 하나 더 만들어 보기로 합니다

ㅎㅎ

 

C클래스를 만들고 부모를 B로 지정해줍니다

여기서 문제!

B를 재정의 했을 때 get / set의 계산속성을 사용했는데

그럼 B에서 get만 사용해도 될까요?

 

정답은?

XXXXX

 

 

수정을 해서 출력을 해봅시다

 

 

B에서 이미 

계산 속성 get / set을 사용했기에

 

재정의를 할 때 get / set을 반드시 사용해야합니다

 

메서드는 추가하지 않고 출력을 해보았습니다

C class name의 get 에서 Cclass로 변경하여서

출력이 Bclass가 아닌 Cclass와 관련된 4줄이 나오는것을 볼 수 있습니다

 

 

이렇게 예시로 작성해볼 수 있습니다

 

계산속성외에 속성감시자로

설정해도 될까?

 

네!

 

 

이렇게 설정이 가능합니다

지금은 self.로 되어있는데 super.로도 가능할까?

 

네!

 

 

마지막으로 overloading에 대해서 알아보고자 합니다

 

overloading이란?

 

오버로딩

|

overloading

 

 

 

메서드는 이름뿐만 아니라 매개변수 타입과 개수까지 기준으로 하여 메서드 이름이 동일하고 타입이 서로 다르다면

같은 메서드로 간주하게 됩니다

 

예를들어 매개변수의 데이터가 같더라도 매개변수명이 다르면 다른걸로 간주합니다

 

 

오버로딩은 가독성을 높이고 일관성을 유지하기 위해 사용되는데요

 

장점은 직관성이 있고 다형성이기 때문에 적절한 버전중 하나가 실행되는걸 알 수 있습니다

그리고 한 함수로 여러개를 만들 수 있기 때문에 코드명을 고민할 필요가 없으며

컴파일러에 의해 결정되기 때문에 편의성이 있습니다

 

하지만 너무 남용하면 혼란이 오기 때문에

파악이 어려울 수 있고

너무 많은 메서드가 존재하면 컴파일러 시간이 늘어나게 됩니다

 

여기까지 상속과 재정의에 대해서 다루어봤습니다

 

❤️혹시나 잘못된 부분이 있다면 댓글로 알려주면 감사하겠습니다❤️

 

 

 

✏️참고

앨런스위프트 문법 자료(강의)

꼼꼼한 재은씨의 스위프트 프로그래밍

반응형