한결과 레지아이스

TIL in Swift about Protocol/Extension & Function Overloading, 22/02/21 본문

Today I Learned/SwiftUI

TIL in Swift about Protocol/Extension & Function Overloading, 22/02/21

miniwho 2022. 2. 21. 20:20

오늘도 스위프트 문법에 대해 조금 더 공부해봤습니다!

1. Protocol & Extension

Protocol과 Extension이라는 개념에 대해서 다룰 건 아니고, 새로 알게된 점을 하나만 짚고 넘어가려 합니다. Protocol에서는 프로퍼티나 메서드를 정의할 수는 없고, 프로퍼티의 경우에는 이름과 타입, get/set을 가지는지 여부를 정해주며, 메서드의 경우 이름과 매개변수, 그리고 반환 타입을 정해줄 수 있습니다.

하지만 이 프로토콜에 Extension을 사용하면, 연산 프로퍼티로 기본 값을 정해줄 수 있습니다!

요런 식으로요!

프로토콜엔 let은 안되고 var만 넣어줄 수 있으며, get/set 둘 다 없이는 안만들어지더라고요.

그리고 Extension안에서도 Computed Property로만 만들 수 있습니다.

하여튼 이걸 왜 적었냐, ObservableObject라는 프로토콜 때문입니다.

ObservableObject라는 프로토콜은 objectWillChange라는 var을 갖고 있는데요, 그럼 이 프로토콜을 준수하려면 해당 프로퍼티를 갖고 있어야겠죠??

근데 그런거 만들어주지 않아도 프로토콜이 준수됩니다. 왜냐???

Extension을 통해 이미 맹글어져있기 때문입니다.

어떻게 생겨먹었는지도 궁금한데 그것까진 못찾아봤습니다... 하여간 프로토콜을 준수하려면 책임을 져야하는데, Extention으로 이미 책임을 누군가가 지고 저는 과실만 건져먹을 수 있게 되었습니다.

앞서 적은 TIL에서 사용한 filter 메서드도 사실은 Sequence Protocol에 대한 Extension 안에 정의되어 있다고 합니다. 그래서 Sequence를 준수하는 Array, Range, String이나 Dictionary 등에서 모두 사용될 수 있다고 합니다. 단 한번 정의되었는데도요!

View도 Protocol입니다! 야는 안에 var body를 가져야하는 책임을 집니다. 그래서 항상 view 안에는 body가 있고, 해당 struct는 이를 통해 View의 파워풀한 기능을 다 가질 수 있습니다.

2. Function Overloading

C에서는 함수를 만들 때 이름이 같다면 반환값의 자료형이나 인자의 이름/자료형이 다르더라도 같은 함수로 취급해 선언이 안됩니다.

그런데 Swift에서는 함수 Overloading을 지원하기 때문에, 함수의 이름이 같더라도 인자의 이름이나 자료형이 다르다면 다른 함수로 취급해 선언을 해줄 수 있습니다! 이게 왜 좋냐면 밑에서 예시를 들어보겠습니다.

Meanwhile in C...

int	sum_integers(int a, int b)
{
	return (a + b);
}

double	sum_doubles(double a, double b)
{
	return (a + b);
}

이런식으로, 똑같은 일을 하는 함수들인데 다른 이름으로 존재해야합니다. 호출할 때마다 다른 이름을 기억하기 귀찮자나요?? 그래서 Overloading을 쓰나봅니다!

이렇게 C에서는 에러가 나지만!!!

However in Swift...

func sum(a: Int, b: Int) -> Int {
	return a + b
}

func sum(a: Double, b: Double) -> Double {
	return a + b
}

이 두 함수가 공존할 수 있습니다!! 그래서

인자의 자료형에 따라 리턴 값이 달라지는 걸 확인할 수 있습니다. 물론 제네릭을 써도 되겠지만 여기서 장점은 코드블럭 안의 내용도 다르게 할 수 있다는 것 같아요!

심지어 인자 라벨만 달라도 다른 함수로 취급하는데요,

굉장히 놀라웠습니다.

어디까지가 같은 함수고 다른 함수냐! 하면,

기본 전제는 함수 이름, 반환형, 각 인자의 자료형이 같을 때,

전달인자 레이블을 사용하는 경우 = 모든 전달인자 레이블이 일치할 때는 같은 함수로 취급 (매개변수 이름 달라도 됨)

전달인자 레이블을 사용하지 않는 경우 = 모든 매개변수 이름이 일치할 때는 같은 함수로 취급 (일부 겹쳐도 됨)

입니다. 나머지 경우는 다 다른 함수로 취급하더라고요.

 

Comments