[Swift]고차함수 - Map, Filter, Reduce

choe_ju·2023년 10월 24일

📎 Map 함수


  • Map 함수는 배열, 딕셔너리, 세트, 옵셔널 등 파라미터로 전달된 값을 함수를 실행하여 지장한 형태로 변환하여 그 결과를 다시 반환해 주는 함수입니다. 사용법이 for-in 구문과 차이는 크게 없지만, 코드의 재사용, 컴파일러 최적화 측면에서 본다면 성능 차이가 있어 자주 사용합니다.

선언 방법은 아래와 같으며 return 뒤에 어떤 식으로 해당 값을 변환하여 반환할지 입력해 주면 됩니다!

변수명.map( 파라미터 in return 변형값 }

예시로 간단하게 보여드리면 아래의 num의 Int형인 숫자배열을에서 String형으로 값을 반환하고 싶다고 하면 아래와 같이 작성하면 되며, 아래에 축약시킨 코드도 실행 방식은 동일합니다.

let num = [1, 2, 3, 4, 5]

// 위의 숫자 배열을 String 타입배열로 반환
var newNumbers = num.map { (num) -> String in return "\(num)" }	//"\(num)" => String 타입을 출력 => 변환

// 위와 동일한 코드 - 생략 및 축약 가능
// var newNumbers = num.map { (num) in return "\(num)" }
// var newNumbers = num.map { return "\($0)" }
// var newNumbers = num.map { "\($0)" }

print(newNumbers)	//["1", "2", "3", "4", "5"] 출력

📎 filter 함수


  • filter 함수는 말 그대로 지정한 조건의 여부를 판단하여 걸러 추출하는 고차함수입니다.
  • 선언 방식은 아래와 같으며 Map 함수와는 다르게 return 값 뒤에 Bool값으로 나타날 수 있는 조건 값을 넣고 해당 값이 true일 경우 반환되며, false일 경우 제외되어 반환되지 않습니다.
변수명.filter( 파라미터 in return 판단 조건(Bool) }

간단한 예제를 들자면 아래의 num 숫자 배열이 있는데 짝수만 출력하고 싶은 경우 아래 해당 조건을 주어 추출할 수 있습니다.

let num = [1, 2, 3, 4, 5]

var newNumbers = num.filter { (num: Int) -> Bool in
	retrun num % 2 == 0	// 2로 나눈 나머지가 0인 값만 반환 (짝수)
}

// 위의 코드 간략화 시킨 예
// var newNumbers = num.filter { (num) in retrun num % 2 == 0 }
// var newNumbers = num.filter { retrun $0 % 2 == 0 }
// var newNumbers = num.filter { $0 % 2 == 0 }	

print(newNumbers)	// [2, 4]

추가로 조건을 여러개 하고 싶은 경우 filter 함수를 아래와 같이 선언하여 중복으로 사용하여 활용하는 것도 가능합니다.

변수명.filter{ 판단 조건1(Bool) }.filter{ 판단 조건2(Bool) }

📎 Reduce 함수


  • Reduce 함수는 모든 값을 결합해 단 하나의 값으로 반환하는 함수입니다. 초기 값을 지정하고 지정해 둔 연산을 통해 초기값에 대해 연산을 모두 시행한 후 해당 결괏값을 반환하는 함수입니다.

Reduce의 구조는 아래와 같습니다.

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
  • initialResult : 초기 결과값으로 사용될 값입니다.
  • nextPartialResult : 클로저로, 배열의 각 요소와 현재의 결과값을 받아 새로운 결과값을 생성합니다.
  • rethrows : 클로저가 에러를 던질 수 있음을 나타냅니다.
  • Result : `reduce` 함수가 반환하는 값의 타입입니다.

간단한 선언 방법은 아래와 같으며 위의 함수들과는 다르게 초기값을 지정하고 해당 조건을 정해 전달해야 합니다. 

변수명.reduce(초기값){(결과값, 파라미터) in return 결합방식 }

만약 간단한 합으로만 reduce를 사용 한다면 아래와 같이 축약한 방식으로도 사용 가능합니다.

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0){(result: Int, num: Int) -> Int in return result + num }

//  축약 선언 방식 - 위와 동일
//  sum = numbers.reduce(0){(result, num) in return result + num }
//  sum = numbers.reduce(0){ return $0 + $1 }
//  sum = numbers.reduce(0){ $0 + $1 }
//  sum = numbers.reduce(0, +)	// 0 초깃값


print(sum) // 출력: 15

0개의 댓글