함수 표기법(지칭), 함수의 타입의 표기
함수 표기법(지칭)
함수를 지칭하는 방법
// 정의문
func doSomething() {
print("출력")
}
func addPrintFunction(_ firstNum: Int, _ secondNum: Int) {
print(firstNum + secondNum)
}
// 실행문
numberPrint(n: 3)
함수를 지칭하려는 경우, 함수를 어떻게 표기할까?
- 1) 개발자 문서를 읽을 때 필요
- 2) 함수를 지칭할때 필요(함수를 변수에 담거나)
함수의 표기법(함수를 지칭시) - 함수를 가르킴 (함수를 실행하는것 아님)
1) 파라미터가 없는 경우, ()를 삭제
doSomething
2) 아규먼트 레이블이 있는 경우, 아규먼트 레이블까지를 함수의 이름으로 봄
numberPrint(n:) // "numberPrint n 함수이다."
3) 파라미터가 여러개인 경우, 콤마없이 아규먼트이름과 콜론을 표기
chooseStepFunction(backward:value:)
4) 아규먼트 레이블이 생략된 경우, 아래와 같이 표기
addPrintFunction(_:_:)
함수 타입의 표기
함수의 자료형을 표현하는 방법
// 변수에 정수를 저장하는 경우에 타입 표기
var num: Int = 5
// 함수의 타입 표기 방법
var function1: (Int) -> () = numberPrint(n:)
var function2: (Int, Int) -> () = addPrintFunction(_:_:)
() -> ()
() -> Void
(String) -> String
(Int, Int) -> ()
(Int, Int) -> Void
* 위의 기호들을 봤을 때, 함수 타입이라는 것을 바로 알아차려야 한다.
함수의 오버로딩(overloading)
오버로드(overload): 영어로 과적하다라는 뜻
같은 이름의 함수에 매개변수(파라미터)를 다르게 선언하여, 하나의 함수 이름에 실제 여러개의 함수를 대응 시키는 것
===> 쉽게말하면: 함수의 이름의 재사용
스위프트는 오버로딩을 지원하는 언어
⭐️ 함수이름, 파라미터 수/자료형, 아규먼트 레이블, 리턴형을 모두포함해서 함수를 식별
func doSomething(value: Int) {
print(value)
}
func doSomething(value: Double) {
print(value)
}
func doSomething(value: String) {
print(value)
}
func doSomething(_ value: String) {
print(value)
}
func doSomethging(value1: String, value2: Int) {
print(value1, value2)
}
doSomething(value: 5)
doSomething(value: 3.4)
doSomething(value: 3)
아하.. 아하! 함수이름은 다 달라야되는줄 알았는데 생각해보니 맞네.. 스위프트는 이미 오버로딩 사용하는 함수가 많았네..
생각해보니 당연하게 쓰던것들 많음..ㅋ
오버로딩을 지원하지 않는 언어의 단점
- 같은 기능을 제공하는 함수를 파라미터 형식마다 이름을 다르게 구현해야하기 때문에 함수의 이름이 많아지고, 구별해서 사용하는 것이 어렵다.
실제 애플에서 만들어놓은 함수들에도 오버로딩을 사용한 함수들이 많음!