*스위프트의 특징
1. 객체지향, 2. 프로토콜 지향
3. 함수형 프로그래밍
First Class Object를 함수가 가지고 있기 때문
스위프트에서 함수는 일급 객체의 특성을 가지고 있음
왜 일급 객체일까? 그 유래를 보면,
영국 크리스토퍼 컴퓨터 과학자가 낸 개념인데. 영국에는 일급 시민이라는 계급이 있었다.
함수가 어느 정도의 기능까지 할 수 있냐에 따라서 일급, 이급, 삼급으로 나눈 것이고 일급 객체만이 지금까지 남은 것이고
일급 객체 함수는 역할을 많이 하고 특이한 아이라는 점에서 그 특징이 크게 3가지가 있다.
일급 객체의 특징
1. 변수나 상수에 함수를 넣을 수 있다.
func checkBankInformation(bank: String) -> Bool {
let bankArray = ["우리", "국민", "신한"]
return bankArray.contains(bank) ? true : false
}
은행 정보를 포함하고 있으면 true를 반환해주는 함수 자체를 checkAccount에 대입한다.
함수 자체를 대입해서 타입을 살펴보면 (String) -> Bool로 [ 매개변수 -> 반환타입 ] 함수 타입을 가지고 있다.
함수만 대입했기 때문에 호출해줘야 실행이 되고,
여기서 주의해야 할 것은 변수 또는 상수에 함수를 실행해서 대입해주는 것은 일급객체의 특성이 아니기 때문에 주의해야 한다.
let checkResult = checkBankInformation(bank: "우리")
해당 checkBankInformation(bank: "우리")는 true 값을 갖고 있다.
checkResult는 checkBankInformation 함수의 반환값의 타입을 갖고 있기 때문에 아니라는 것이다.
이렇게 봤을 때, Function Type(함수 타입)을 가지고 있는 걸 첫 번째 특징이라고 보면 된다.
튜플이랑 비교해서 보면 Function Type을 이해하기 쉽다.
어떤 함수 타입은 해당 함수가 어떤 매개변수를 갖고 있냐에 따라서 달라진다.
swift3부터는 매개변수에 괄호 명시를 해줘야 한다.
오버로딩 특성상 함수를 구분하기 힘든 경우, 타입 어노테이션을 통해서 함수를 구분할 수 있다.
let result: (String, Int) -> String = hello
result("고래밥", 22)
let result2: (String) -> String = hello
result2("고래밥")
그러나 위와 같은 경우에는 타입 어노테이션만으로는 함수를 구별하기 어려운 상황이 생긴다.
그래서 함수 표기법을 사용한다면 타입 어노테이션을 생략하더라도 함수를 구별할 수 있다.
함수 표기법 - 전달인자 부분을 작성해주는 것 (타입 어노테이션 외에)
let result: (String) -> String = hello(username:)
let result2 = hello(nickname:)
2. 함수의 매개변수(인자값)에 함수를 넣을 수 있다.
매개변수와 반환값이 없는 () -> ()인 함수를 만든다.
func oddNumber() {
print("홀수")
}
func evenNumber() {
print("짝수")
}
두 번째로 숫자를 넣어서 해당 숫자가 짝수인지 홀수인지 판단해주는 함수를 만든다.
func resultNumber(number: Int, odd: () -> (), even: () -> ()) {
return number.isMultiple(of: 2) ? even() : odd()
}
resultNumber 함수의 매개변수타입은
(Int, () -> (), () -> ())
resultNumber 함수의 매개변수에 각각 Int 타입에 해당하는 숫자와 () -> () 함수 타입을 가진 함수를 전달해줄 수 있다.
resultNumber(number: 9, odd: oddNumber, even: evenNumber)
해당 함수를 이렇게도 작성해줄 수 있다.
resultNumber(number: 2) {
print("홀수")
} even: {
print("짝수")
}
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] 동기, 비동기 시작하기 앞서 그냥 오늘 배운 거... (0) | 2022.08.05 |
---|---|
[Swift] 강순참이 존재하게 된 이유... (0) | 2022.08.05 |
[iOS] Alamofire, SwiftyJSON을 사용해서 HTTP 통신하기 (0) | 2022.08.02 |
[Swift] Singleton Pattern (0) | 2022.08.02 |
[Swift] ReusableViewProtocol로 뷰컨/셀 식별자 사용하기 (0) | 2022.08.02 |