본문 바로가기
iOS_Swift/문법 정리

Swift - 고차함수(Higher - order function)

by chozjjae 2022. 5. 20.

고차함수(Higher - order function) 이란 ?

  • 다른 함수를 매개변수로 받거나 함수 실행 결과를 함수로 반환하는 함수를 의미한다.
  • 대표적인 고차함수 : map(맵), filter(필터), reduce(리듀스)
  • Swift의 함수(클로저)는 1급 객체(first class Object) 또는 1급 시민(first class citizen)이기 때문에 함수의 매개변수로 전달할 수 있으며, 함수의 리턴값으로 반환할 수 있다.

고차 함수를 학습하기 위하여 꼭 알아야할 내용 3가지

 

*함수 - 1급 객체(first class Object), 1급 시민(first class citizen)

  1. 함수를 변수에 저장할 수 있다.
  2. 매개변수로 전달할 수 있다.
  3. 리턴값으로 사용할 수 있다.

*클로저(closure) - 독립적인 코드 블록

후행 클로저(trailing closure) - 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현한다.

 

*단축인자(shorthand argument name)

$0(첫번째 값) + $1(두번째 값)


map - 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 새로운 컨테이너를 생성하여 반환한다.

*기존의 컨테이너 값은 변경되지 않는다.

시퀀스(Sequence), 콜렉션(Collection) protocol을 준수하는 타입과 옵셔널은 map 함수를 사용할 수 있다.

map예제 1

let cho = [0,1,2,3]
let num = cho.map({(x:Int) -> Int in //클로저 구현식 사용
    return x + 1 
})
print(cho, num) //[0, 1, 2, 3] [1, 2, 3, 4]

var up = cho.map{ $0 + 1 } //단축인자를 사용한 구현식
print(up) //[1, 2, 3, 4]
print(cho) //[0, 1, 2, 3]
//첫 Array값은 변경되지 않는다.

map 예제 2

let cho = [1,2,3,4]
var arr = cho.map { $0 + 1 }
print(arr) //[2, 3, 4, 5]
print(cho) //[1, 2, 3, 4]
arr = cho.map { $0 - 1 }
print(arr)//[0, 1, 2, 3]
print(type(of:cho))//Array<Int>
print(type(of:arr))//Array<Int>

map 예제 3 - String 사용

//String 사용
var cho = "hello!"
var arr = Array(cho)
//문자열에서 배열로 나타내는 방법
print(arr) ////["h", "e", "l", "l", "o", "!"]

let arr1 = cho.map {String($0)}
//고차함수 사용하여 배열로 나타내는 방법
print(arr1)//["h", "e", "l", "l", "o", "!"]

let color = ["red", "blue","green", "yellow"]
let c = color.map {$0.count} //글자의 숫자 표시하는 고차함수
print(c)//[3, 4, 5, 6]

compactMap 사용하기 - Map과 사용법이 같다.

  • optional형으로 래핑되어 있는 배열 값을 언래핑하여 풀어서 값을 출력해준다.
  • nil 값은 제외하고 값을 출력한다.
var cho : [Int?] = [1,2,3,4,5,nil]
var kim = cho.map{$0} 
//그대로 옵셔널 형으로 출력
print(kim)
//[Optional(1), Optional(2), Optional(3), Optional(4), Optional(5), nil]
var lee = cho.compactMap {$0}
//옵셔널과 nil 값을 풀어서 출력
print(lee)
//[1, 2, 3, 4, 5]

filter - 컨테이너가 담고 있던 각각의 값을 조건에 맞는 새로운 값만 추출하여 반환

  • for문과 if 문을 사용하여 표시하던 소스코드를 한줄에 표현 할 수 있다.

for, if 문 사용 소스코드

//filter을 사용하지 않은 코드
let cho = [1,2,3,4,5]
var c = [Int]()
for x in cho{
    if x % 2 == 0{
        c.append(x)
    }
}
print(c) //2,4

filter 사용 소스코드

let cho = [1,2,3,4,5]
let c = cho.filter{ $0 % 2 == 0 }
print(c) //[2,4] , 짝수만 출력

let h = cho.filter{ $0 % 2 != 0}
print(h) //[1,3,5] , 홀수만 출력

reduce - 컨테이너 내부의 값을 하나로 통합 또는 연산하여 리턴한다.

예제 1 - 정수형을 사용한 방법

for 문을 사용한 예시

let cho = [1,2,3,4]
var sum = 0
for c in cho{
    sum = sum + c
}
print(sum) //10

reduce를 사용한 예시

let cho = [1,2,3,4]

let co = cho.reduce(1, {$0 * $1})
//앞에 붙는 1은 초깃값이라고 생각해주면 된다.
print(co) //24

let kim = cho.reduce(0) {$0 + $1} //후행클로저 사용
print(kim) //10

예제 2 - 문자열을 사용한 방법

let cho = ["c","h","o"]
let kim = cho.joined()
//문자열을 합쳐주기만 한다.
print(kim)//cho

let lee = cho.reduce("hello",{$0 + $1})
//문자열을 합쳐주고 초기 값과 같이 앞에 추가 할 수 있다.
print(lee) //hellocho

let y = ["a","b","c"]
let kim = y.reduce("hi, ") {$0 + $1} //후행클로저 사용
print(kim) //hi, abc

인덕대학교 한성현 교수님의 강의 자료를 참고하였습니다.

'iOS_Swift > 문법 정리' 카테고리의 다른 글

Swift - Subscript(서브스크립트)  (0) 2022.05.21
Swift - Array(배열)  (0) 2022.05.18
Swift - Generic < >  (0) 2022.05.17
Swift - 오류 처리[Error Handling]  (0) 2022.05.15
Swift - 옵셔널 체이닝(Optional Chaining)  (0) 2022.05.14