Weekoding

[Swift] extension(확장)과 inheritance(상속) 본문

공부 노트(Swift)

[Swift] extension(확장)과 inheritance(상속)

Weekoding 2023. 5. 24. 21:50

나는 컴퓨터공학과였어서 전공 초기에 JAVA를 배우게 되었었다.

상속을 비롯하여 여러 개념들을 배우고 지나갔던 기억이 나는데,

Swift를 배우면서 extension이라는 키워드를 접하게 되었고 그것이 "확장"을 의미한다는 것을 알게 되었다.

확장 또한 많이 쓰이는 키워드이다. 두 키워드의 차이점에 대해 알아보도록 하자.

 

 

 

📂  inheritance

: 수직으로 클래스를 확장하는 것.

기반 클래스를 다른 클래스에서 물려받는 것을 의미한다.

부모클래스로부터 물려받은 메소드, 프로퍼티를 재정의(override)할 수 있고 자신의 기능도 추가할 수 있다.

클래스 이름 뒤에 콜론(:)과 물려받을 클래스 이름을 붙여주면 해당 클래스로부터 상속받을 것임을 의미한다.

 

[⭐️ 알짜상식 - swift의 상속 관련 키워드]
override : 재정의 시, 물려받은 특성 앞에 'override'라는 키워드를 붙여준다.

super : override와 반대로, 부모클래스의 특성을 사용하고 싶을 때는 앞에 'super' 키워드를 붙여준다.

final : override를 제한하고 싶을 때는, 'final' 키워드를 특성 앞에 붙여준다.

 

 

 

📂  extension

Swift의 기능 중 하나. 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 수평적으로 추가할 수 있다.

'extension' 이라는 키워드를 통해 선언할 수 있다.

extension UIView{
  //UIView 클래스에 새로운 기능 추가
}

extension UIView: MyProtocol1, MyProtocol2{
  //추가로 다른 프로토콜을 채택할 수도 있다.
}

다음과 같은 기능들을 추가할 수있다.

  • 연산 프로퍼티
  • 메소드
  • 이니셜라이저
  • 서브스크립트

타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능은 재정의할 수 없다.

원본 소스를 수정하지 못하는 외부 라이브러리, 프레임워크 등 외부에서 가져온 타입에 기능을 추가하고자 할 때 편리하다.

또한 따로 상속할 필요가 없고, 구조체와 열겨형에도 추가가 가능하니 상당히 강력한 기능이라고 할 수 있겠다.

(Objective-C에도 Swift의 Extension 같은 기능이 있는데, 이를 Category라고 칭한다.)

 

 

🗝 inheritance vs extension

포인트는 확장의 구조!

  inheritance extension
확장 수직 확장 수평 확장
사용가능한 타입 오직 클래스 타입만 클래스, 구조체, 프로토콜, 제네릭 타입 등
override 재정의 가능 재정의 불가

 

그림으로 보니 이해가 더 쉬운 것 같다.

둘중 어떤 것이 더 나은 방법이라기보다는, 명백한 차이점이 있기에 상황에 맞게 사용하는 것이 중요하겠다. 

 

 

 

📌 마치며

Java만 배울 때는 와 정말 기능의 전달에 있어 유용하구나 싶었는데

막상 extension을 접하고 났을 때는 와.. 왜 수직을 수평으로 바꾸어 볼 생각을 못했지? 싶었다

확실히 상황에 맞게 사용한다면 두 기능 모두 간결한 코드로 기능 확장에 도움이 되는 것 같다.

 

 

 

 

 

오류 및 지적사항은 댓글로 남겨주시면 감사하겠습니다!

참고 :  Swift Programming 3판, 야곰 지음

Comments