패스트캠퍼스) ios 개발 챌린지

[패스트캠퍼스 수강 후기] IOS개발강의 100% 환급 챌린지 15회차 미션

student513 2020. 11. 16. 11:15

오늘은 좀 중요한 개념에 대해 배웠다.

오버로드와 순수함수에 대한 개념인데, 3학년 실습시간에 초기에 배웠던 개념이다.

(그 수업 진짜 거지같았다.)

함수의 오버로드란?

일단 코드부터 보면 빠르다

func printTotalPrice(price: Int, count: Int) {
    print("Totla Price: \(price * count)")
}

func printTotalPrice(price: Double, count: Double) {
    print("Totla Price: \(price * count)")
}
func printTotalPrice(가격: Int, 갯수: Int) {
    print("Totla Price: \(가격 * 갯수)")
}

세 함수 모두 이름이 똑같고 하는 일도 똑같다.

가격과 갯수를 입력받으면 곱해서 총합을 반환한다. 

 

그런데 C언어 기반이라 그런지 타입 체크가 엄격하다.

이게 뭐 장점도 있고 단점도 있는데, 

장점이라면 혹여나 함수에 잘못된 파라미터를 넘겨줄 일이 줄어든다는 것

단점이라면 일일히 표기하기 귀찮다는 것 정도다.

예상치 못한 에러가 터져 머리 싸매고 고민할바에는 손가락 좀 더 부지런히 놀리는게 낫다

 

아무튼 해당 함수에 대하여 Int, Double 둘 다 받고 싶을 수 있다. 

그 경우 같은 이름으로 타입만 달리 선언할 경우, 파라미터가 입력되는 상황에 따라 컴파일러가 적당한 함수를 자동으로 호출해준다.

이게 오버로드다

 

그 다음은 In-out 선언이다.

단순하게 한 가지 기능만을 수행하며 사이드 이펙트를 일으키지 않는게 좋은 함수이다.

사이드 이펙트라고 하면 간단히 말하자면 함수 내에서 함수 밖의 데이터에 대해서 영향을 주는 행위를 말한다.

이게 의도한 것일 수도 있고, 꼭 필요한 상황에서만 사용하면 좋지만

남발하다보면 의도치 않은 곳에서 나도 모르게 데이터가 이리저리 꼬여버릴 수도 있다.

 

(개발자란 원래 완벽한 생물이 아니기 때문에 모든 코딩이 의도한대로 흘러가진 않는다.)

 

그래서 스위프트는 함수 내에서 데이터를 직접 변형하는 것을 컴파일러 차원에서 차단하고 있다.

사이드 이펙트를 일으키지 않는 이런 함수를 순수함수라고 한다.

// 에러 발생
func incrementAndPrint(_ value: Int) {
    value += 1
    print(value)
}

// In-out parameter
func incrementAndPrint(_ value: inout Int) {
    value += 1
    print(value)
}

incrementAndPrint(value: &Int)

첫 번째 함수는 파라미터로 받아온 value의 값을 직접 수정하려한다.

그러나 위에서 언급했던 모종의 이유로, 이런 코드를 권장하지는 않는다

 

그럼에도 불구하고 불가피하게 사이드이펙트를 일으켜야한다면 해당 파라미터에 대해 inout이라는 키워드를 붙여주도록 한다.

이 경우 함수를 선언할 때, 변수의 타입앞에 &를 붙여줘야한다.

(2020년에 포인터로 개발하게 될 줄은 몰랐다) 

 

그 다음은 optional에 관한 것인데

삼항연산자와 관련 깊은 내용이다. 그건 다음 시간에 다뤄보자

 

올인원 패키지 : iOS 앱 개발👉https://bit.ly/2FjWizq