안녕하세요!
오늘은 확장에 대해서 정리하고자 합니다
한 번 훑어봤을 때
확장은 c#에서도 있지만 static keyword를 사용했던걸로
기억이 나는데요
확장
|
extension
클래스 / 구조체 / 열거형 / 프로토콜
새로운 기능을 추가할 수 있게 해주는 기능입니다
추가할 수 있는 기능이 많은데요
메서드 추가
계산된 속성추가
서브스크립트 추가
초기화 메서드 추가
중첩 타입 추가
기존 타입을 프로토콜 준수하도록 만들 수 있음
새 기능을 추가는 할 수 있지만
기존 기능을 재정의 할 수는 없습니다
+
클래스 한정하여 지정생성자는 본체에서 인스턴스를 찍어내는 중요한 역할을 하므로 확장에서 구현하지 못함
(사실상 가능함)
하지만
클래스의 경우 편의 생성자만 추가가 가능하고 지정생성자 소멸자는 반드시 본체에 구현을 해야합니다
쉽게 말해서 식당에가서 메뉴를 주문할 때
추가주문하잖아요
라면사리, 우동사리, 만두 등등.. 그냥 이렇게 재료를
추가한다는 의미로 이해하면 쉬울것 같네요
엄연히 재정의와 다른 의미입니다
이렇게 많은 기능이 있으며
원본 소스 코드에 대한 접근 권한이 없는 유형을 확장하는 기능이 포함되어있습니다
📕예- Int, String, Double 등 애플이 미리 만들어 놓은 타입에 확장도 가능
확장의 기본 형태
확장의 기본형태는
extension 키워드를 사용하면 됩니다
extension + class / struct / enum / protocol 명 (인스턴스명)
구조체 / 열거형 예시
보다시피
구조체와 열거형도 확장으로 사용이 가능하고
그리고 확장은
컴파일러가 확장된 메서드나 속성을 해당 타입의 일부로 간주하게 한다
그래서 class 확장의 경우 - heap
struct / enum 확장의 경우 - stack
에 저장하게 됩니다
그리고 확장에서
Int, String, Double등 애플에서 미리 만들어 놓은 타입에도 확장이 가능하다고 합니다
미리 만들어놓은 타입에서 확장
정수 Int는 구조체로 이루어져 있고
변형해서 사용은 못하지만 확장은 가능하기에 이렇게 사용할 수 있답니다
return을 사용하지 않고 사용하려면
mutating을 사용해서 구현해야합니다
여기서 알아볼 수 있는건
메서드 추가와 계산속성 기능에 대해서 알아볼 수 있었습니다
메서드를 사용하게 되면
재사용성이 가능하고
이미 구현된 클래스 안에 들어가서 정의할 수 없는 부분에서 확장에서 재정의 하는 경우입니다
이번엔 서브스크립트 확장 예시를 보고자합니다
서브스크립트 추가
String (input) -> Character?(output)
앞에서 몇번째 문자를 가지고 올건지에 대한 서브스크립트를 작성해서
들고오는걸 볼 수 있습니다
초기화 메서드 추가
기존 타입의 사용성을 개선하고 초기화 옵션을 다양화하고
타입외부에서 초기화 메서드를 제공하고 프로토콜에 준수하기 위해서 사용을 합니다
이렇게 사용하면 좀 더 유연하고 직관적으로 사용할 수 있기 때문입니다
이렇게 초기화 메서드를 확장으로 작성하는 이유는
확장을 통해 year month day를 통해서 date를 초기화할 수 있는 메서드를 추가하여
좀 더 직관적으로 초기화를 할 수 있기 때문입니다
numberOfWheels 매개변수로 받는 지정 생성자를 가지고 있습니다
확장에서 편의 생성자를 추가하여 값 4개의 바퀴를 가지는 Vehicle을 생성할 수 있습니다
지정생성자는 확장에서 추가하는 것이 가능하지만
타입의 유연성과 사용성을 높일 수 있지만
클래스에서 상속 계층과 관련된 제약 사항, 기본제공 생성자와의 충돌 가능성, 저장프로퍼티 초기화 요구사항
등을 고려해서 사용해야합니다
이를 고려해서 사용한다면 유용하게 활용할 수 있습니다
그리고 더하여
구조체와 클래스를 나눠서 설명을 하고자 합니다
구조체 경우
확장을통해서
생성자를 생성하는 경우를 볼 수 있습니다
생성자를 만들기 위해
매개변수를 다르게 지정하여 호출하고 본 구조체에서
지정생성자를 불러오는 경우를 볼 수 있습니다
사각형을 중앙에서 생성하는걸
확장으로 만드는걸 볼 수 있습니다
마지막으로
초기화를 다 끝난 시점
기본적으로 멤버와이즈 이니셜라이저 기본 제공을 하고 있습니다
그래서 확장에서 초기화를 할 때
자유롭게 생성자 구현이 가능합니다
클래스 경우
convenience를 사용하여 확장을 해야합니다 :)
편의생성자로 본체의 지정생성자 호출을 한다고 생각하시면 됩니다!
중첩타입의 추가
중첩타입을 사용하는 이유는
관련된 타입들을 논리적으로 그룹화를 할 수 있기 때문입니다
가독성과 유지보수를 높이는데 도움이 됩니다
외부에서 접근할 필요가 없는걸 캡슐화할 수 있습니다
그리고 특정 기능에 대한 범위를 한정할 수 있기 때문에 중첩타입을 사용합니다
프로토콜은 아직 배우지 않았기에 다음에 정리하면서 같이 설명하겠습니다 :)
❤️혹시나 잘못된 부분이 있다면 댓글로 알려주면 감사하겠습니다❤️
✏️참고
앨런스위프트 문법 자료(강의)⭐️⭐️⭐️ -추천
Swift 공식문서
'Swift' 카테고리의 다른 글
Swift | 프로토콜(Protocols)에 관하여 -2 (0) | 2024.05.20 |
---|---|
Swift | 프로토콜(Protocols)에 관하여 -1 (0) | 2024.05.20 |
Swift | 타입캐스팅(Type Casting)에 관하여 - is / as (0) | 2024.05.19 |
Swift | 서브스크립트(Subscripts)에 관하여 (0) | 2024.05.17 |
공식문서 Swift | class(클래스) 필수 생성자 / 실패가능 생성자(c / 소멸자에 관하여 (0) | 2024.05.17 |