Skip to content

[week07] 고차함수

serena edited this page Jun 30, 2023 · 2 revisions

7주차 토요스터디 주제: 고차함수 (23.06.10)

🔥 고차함수란?

  • 함수를 매개변수로 전달받는 함수
  • 함수의 실행결과를 함수로 반환하는 함수
  • 기본 형태
// (Int, Int) -> Int : Int 2개의 매개변수를 갖고 Int를 반환하는 함수의 "타입"
func abc(param: (Int, Int) -> Int) {

} 

// (Int, Int) -> Int : Int 2개의 매개변수를 갖고 Int를 반환하는 함수를 반환
func bcd() -> (Int, Int) -> Int {

}

func eee(param: (Int, Int) -> Int) -> (Int, Int) -> Int {

}
  • 활용 예시
class Calculator {
	func add(lhs: Int, rhs: Int) -> Int {
			return lhs + rhs
	}

	func substract(lhs: Int, rhs: Int) -> Int {
			return lhs - rhs
	}

	func divide(lhs: Int, rhs: Int) -> Int {
			return lhs / rhs
	}

	func multiply(lhs: Int, rhs: Int) -> Int {
			return lhs * rhs
	}
}

let calculator = Calculator()
calculator.add(lhs:1, rhs:2)
calculator.divide(lhs:3, rhs:4)

// 제곱 계산을 해야하는 경우?
class Calculator {
	func operate(lhs: Int, rhs: Int, operator: (Int, Int) -> Int) -> Int {
			return operator(lhs, rhs)
	}
}

let calculator = Calculator()
calculator.operate(lhs: 1, rhs: 2) { lhs, rhs in
		return lhs + rhs
} 

// 이거랑 동일
func add(lhs: Int, rhs: Int) -> Int {
		return lhs + rhs
}
let result: Int = calculator.operate(lhs: 1, rhs: 2, operator : add)

//클로저를 쓴 경우
let result: Int = calculator.operate(lhs: 1, rhs: 2, operator : { (lhs, rhs) in
		return lhs + rhs
})

Map

  • 컨테이너 내부의 요소를 처리하는 고차함수
  • 기존 컨테이너의 요소를 전달받은 함수를 사용하여 매개변수를 '변형'한 후 새로운 컨테이너로 변환
  • 이로인해 타입변경이 될 수 있다

Filter

  • 기존의 컨테이너의 요소 중 전달받은 함수의 결과값이 true인 경우만 포함하여 새로운 컨테이너로 반환
  • 요소의 갯수는 달라질 수 있지만, 타입은 변경될 수 없다.

Reduce

  • 기존의 컨테이너의 요소를 하나로 통합하는 고차함수
  • 요소들을 반복적 연산을 하기위해 사용
  • 연산의 초기값을 줘야 한다

🔥 실습

  • 직접 고차함수를 만들어 보자

1️⃣ Map

extension String {
    func myMap(_ method: (String) -> String) -> [String] {
        var result: [String] = []
        
        for i in self {
            var plus = method(String(i))
            result.append(plus)
        }
        return result
    }
}

var A = "123"

A.myMap({
    $0 + "나"
})

2️⃣ Filter

extension String {
    func myFilter(_ isIncluded: (Character) -> Bool) -> [String] {
        var result: [String] = []
        
        for i in self {
            let isTrue = isIncluded(i)
            if isTrue {
                result.append(String(i))
            }
        }
        
        return result
    }
}

"2re3sd4sd5d6".myFilter {
    $0.isNumber
}


3️⃣ Reduce

extension String {
    func myReduce(_ initResult: String, _ method: (String, String) -> String) -> String {
        var result: String = initResult
        
        for i in self {
            result = method(result, String(i))
        }
        
        return result
    }
}

"123".reduce("0", { $0 + "번" + String($1) })

"123".myReduce("0", { $0 + "번" + $1 })