1월 26일 TIL (고차함수)

이승원·2024년 1월 25일
0

TIL

목록 보기
10/75
post-thumbnail

고차함수 (Map, Filter, Reduce)

  • 고차함수 (High Order Function)은 다른 함수를 인자로 받거나, 함수의 결과로 함수를 반환하는 함수를 의미한다, 클로저랑 빼먹을수 없는 중요한 관계를 갖고 있다. 대표적으로 사용하는 고차함수가 Map, Filter, Reduce이다.

Map

  • Collection 내부의 데이터를 가공을 해서 새로운 콜렉션으로 생성한다. 중요한건 Map은 원본 컬렉션의 타입에 따라서 반환값이 달라진다. map 함수를 사용하여 배열에 적용하면 반환값은 배열이고, Dictionary 에 적용하면 Dictionary로 반환된다. 그리고 map 함수는 컬렉션의 각 요소를 순회하면서 변환하기 때문에, O(n)의 시간복잡도를 갖는다.
//Array 예시
 	let numbers = [1,2,3,4,5]
 	let square = numbers.map {$0 * $0}
 
 // 위 줄이랑 아래 줄이랑 같은 의미를 갖는다. 클로저를 쓰냐 아니면 함수를 쓰냐의 차이.
 	func power2(_ number: Int) -> Int {
 		return number * number
 	}
 	let power = numbers.map(power2)
 
 //Dictionary 예시
 
 	let scores = ["Alice": 85, "Bob": 92, "Charlie": 78]
	let gradeScores = scores.map { key, value in
		return (key, value >= 90 ? "A" : "B")
	}
    

Filter

  • filter는 콜렉션 내부에서 조건에 맞는 데이터들만 골라 새로운 콜렉션을 생성한다. 이것도 마찬가지로 콜렉션의 타입의 따라서 반환값이 달라진다.
//Array 예시
	let numbers = [1,2,3,4,5,6,7,8,9,10]
    let Even = numbers.filter{$0 % 2 == 0}

//Dictionary 예시
	let scores = ["Alice": 85, "Bob": 92, "Charlie": 78]
   	let whoAbove80 = numbers.filter{$0.value >= 80}

Reduce

  • reduce는 콜렉션 내부의 데이터들을 하나로 통합시킨다. 두개의 인자를 받고, 첫번째 인자는 초기값이고, 두번째는 함수(클로저)를 받는다. 초기값은 콜렉션 데이터의 따라서 인자로 넘거줘야한다. swift에서 사칙연산자도 함수(클로저)라고 한다!
//Array 예시
	let numbers = [1,2,3,4,5,6,7,8,9,10]
    let Sum = numbers.reduce(0,+)
    
//Dictionary 예시
	let scores = ["Alice": 85, "Bob": 92, "Charlie": 78]
    let sum = numbers.reduce(0){$0 + $1.value}
   
  • 위에 코드 보면 뭐 별거 없네 할 수 있는데, 난 항상 다른사람의 코드를 보면서 $0이 무슨뜻인지 항상 이해가 안됐다. 0번째 매개변수 이라는 뜻 아니야? reduce에서는 다른의미를 갖고 있다. $0은 누적값을 의미한다고 한다. 즉 누적값 + $1.value가 되는거다.
profile
개발자 (진)

0개의 댓글