이번에는 스위프트에서 강조하는 확장의 기능에 대해서 확인해보도록 하자.
스위프트에서 왜 강조를 하는지 모르겠지만.. 그냥 다른 언어에서는 약간 다르게 활용하는 extension을 좀더 편하게 쓸 수 있다는 것을 강조하는 것 같다..
공부를 해보고 좀 활용을 해보니까 굳이?? 이렇게 강조를 하면서 설명을 할 이유인가 하는.. 왜냐면 어차피 C나 JAVA 에서도 비슷한 내용은 있으니까...
그래도 우선 Swift의 Extension에 대해서 한번 알아보도록 하자.
extension
- 기존의 클래스, 열거형, 구조체, 프로토콜에 새로운 기능을 추가하는 기능
- 익스텐션이 타입에 추가할 수 있는 기능
- 연산 타입 / 연산 인스턴스 프로퍼티, 타입 메소드, 인스턴스 메소드, 이니셜라이저
- 서브스크립트, 중첩타입, 특정 프로토콜을 준수할 수 있는 기능 추가
- extension 타입에는 새로운 기능을 추가할 수 있지만, 기존에 존재하는 기능을 오버라이드 할 수는 없다.
extension 사용법
extension 사용할타입 { 추가할 기능 } |
extension에 대해서 대략적으로 정의를 알아보았다. 그럼 실습을 통해서 extension을 어떻게 사용하는지 확인해보도록 하자.
좌측의 이미지를 확인했을 때에 필자의 경우에는 Float 소수점 타입에 대해서 extension을 진행해보려고 내용을 작성하였다.
우측의 이미지는 곱하기 2를 자동으로 해줄 수 있는 내용에 대해서 작성을 해보았다. 이후에 해당 extension 내용을 사용할 때에는 클래스나 구조체에서 프로퍼티나 함수들을 사용할 때와 동일하게 사용하면 된다.
기존에 Float 형태의 변수에 8.1을 대입했고, 이후에 extension 내용인 multi2를 호출하였더니 이렇게 자동으로 곱하기 2가 되어 16.2가 되는 것을 확인할 수 있다.
이처럼 기본적으로 제공되는 타입을 확장해서 사용할 수 있다.
특정 타입에 대해서 자주 사용하는 것들을 애초에 이렇게 작성해서 사용할 수 있다는 뜻이다.
참고로 extension은 연산 프로퍼티를 추가할 수는 있지만, 저장 프로퍼티는 추가할 수 없다. 즉, 값의 저장은 안된다는 의미이다.
또한 타입에 정의되어 있는 기존의 프로퍼티에는 프로퍼티 감시자를 추가할 수 없다.
기존에 만들었던 Float extension에 타입 메소드를 추가해보았다.
func convertToint()라는 메소드를 추가하였고, 이후 해당 타입이 옵셔널 타입으로 반환되도록 지정하였다.
이후에 number.convertToint()를 호출했을 때에 8.1이 아닌 8이 표기되는 것을 확인할 수 있었다.
이렇게 자동으로 형변환을 시켜주는 내용 역시 extension을 통해 타입의 내용을 확장시킬 수 있다.
또한 이니셜라이저, 서브스크립트, 중첩 타입을 이용하여서도 기능을 확장할 수 있다.
이번에는 extension의 이니셜라이저에 대해서 내용을 확인해보도록 하자.
extension의 이니셜라이저에 대해서는 필자도 이해가 잘 안가서 Swift 문서의 내용을 참고하여 작성을 해보도록 하겠다.
자세한 내용이 필요하면 링크를 클릭하면 된다.
extension은 class에 새로운 이니셜라이저를 추가할 수 있지만, 클래스에 지정된 init 또는 deinit을 추가할 수는 없다.
지정된 init 및 deinit은 항상 원래 클래스의 구현에서 제공해야한다.
우선 Swift 문서에 나와있는 예제를 가지고 작성을 해보았다. 그리고 중간중간 주석을 작성하면서 추가설명을 작성하였다.
정리를 하면 Size와 Point를 가지고 있는 Rect 구조체를 만들었고, 이후에 해당 구조체에 각각의 x,y 좌표 2.0을 입력했고, 그 도형의 size를 5.0씩 입력을 하였다.
보통 해당의 내용이 dump를 통해 확인하면 기존의 구조체에 초기 값을 넣어준 내용과 동일하게 2.0 / 5.0 으로 표기가 된 내용이다.
이제 이 내용을 구조체 Rect를 확장하여 init을 진행해보도록 하자.
Swift에서 안내한 내용의 값을 약간 수정하여, 주석을 표기하였다.
기존에 x, y를 각각 2.0씩 입력 받았고, 이후에 size 는 5.0씩 입력을 받았다.
원래대로라면 확장을 하기 전의 rect라면 기존에 입력된 값대로 나와야하겠지만, init을 통해서 초기화 당시에 연산 프로퍼티 개념으로 예제가 되어있었다.
따라서 Rect 인스턴스인 centerRect를 생성하여, 값을 입력하였을 때에 init이 호출되어 위의 이미지대로 내용이 변경된 것을 확인할 수 있다.
이렇게 init 자체의 개념을 확대하여, 새로운 내용을 추가하여 작성할 수 있다.
오늘 진행한 내용에 대해서 정리를 하면 extension은 기존에 있는 내용에 확대를 하여 나만의 기능을 추가할 수 있는 개념이라고 생각하면 편할 것 같다.
'APPLE > Swift 문법' 카테고리의 다른 글
[ 기초 문법 ] 옵셔널 체이닝 (0) | 2022.08.23 |
---|---|
[ 기초 문법 ] 열거형 (0) | 2022.08.22 |
[ 기초 문법 ] Protocol (0) | 2022.08.19 |
[ 기초 문법 ] guard (0) | 2022.08.19 |
[ 기초 문법 ] Assert / Preconditions (0) | 2022.08.17 |