๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ iOS & Swift

[iOS] ๋ฐฐ์—ด์˜ ๊ณ ์ฐจ ํ•จ์ˆ˜ - Higher Order Fuctions

Higher Order Function, ์Šค์œ„ํ”„ํŠธ ๊ณ ์ฐจ ํ•จ์ˆ˜

 

๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ๋ฐฐ์—ด ๊ทธ๋Œ€๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ด์™ธ์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ๋ณ€ํ˜•์‹œ์ผœ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด๋•Œ๋งˆ๋‹ค ์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด๋ฌธ์„ ์ด์šฉํ•ด ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์ œ๋ฒ• ๊ธธ๊ฒŒ ์ž‘์„ฑํ•ด์„œ ๋ฐฐ์—ด์„ ์ฒ˜๋ฆฌํ•˜๊ณ ๋Š” ํ•˜๋Š”๋ฐ์š”. ์ € ์—ญ์‹œ๋„ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ์— SOPT๋ผ๋Š” IT ๋ฒค์ฒ˜ ์ฐฝ์—… ๋™์•„๋ฆฌ์—์„œ APPJAM ์ด๋ผ๋Š” 3์ฃผ๊ฐ„์˜ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ค‘์š”ํ•˜๊ฒŒ ๋Š๋‚€ ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ž˜ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๋‚ด์šฉ์—์„œ๋Š” ์ •๋ง ์ผ๋ถ€๋ถ„๋งŒ ๋‹ค๋ฃฌ ๊ฒƒ์ธ๋ฐ์š”. ์ด ์—ญ์‹œ Apple Develeoper ๊ณต์‹ ๋ฌธ์„œ์— ์ •๋ง ์ž์„ธํ•˜๊ฒŒ ์ž˜ ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. (์ง„์งœ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๋Š๋ผ๋Š” ๊ฒƒ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ž˜ ์ฝ์ž ์ธ ๊ฒƒ ๊ฐ™๋„ค์š”..ใ…Žใ…Ž)

 

๋ญ ์—ฌํŠผ! ์˜ค๋Š˜์€ ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜ 5๊ฐ€์ง€๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด์˜ ๊ณ ์ฐจ ํ•จ์ˆ˜ (Higher Order Fuction)

์ด๋ฒˆ์—๋Š” Array์˜ ๊ณ ์ฐจํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

map, reduce, filter, flatMap, compactMap

// MARK: - Custom Functions
extension ViewController {
    // Mark: - Map
    // - ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜
    private func executeMap() {
        let doubledNumbers = numbers.map { $0 * 2 }
        print(doubledNumbers)
    }
    // Mark: - Reduce
    // - ์ดˆ๊ธฐ์›์†Œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๊ณ , ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ํ•ฉ์ณ์„œ ๋ฐ˜ํ™˜
    private func executeReduce() {
        let sum = numbers.reduce(0) { $0 + $1 }
        print(sum)
    }
    // Mark: - Filter
    // - ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ๊ณ  True์ธ ์š”์†Œ ๋ฐ˜ํ™˜
    private func executeFilter() {
        let even = numbers.filter { $0 % 2 == 0 }
        print(even)
    }
    // Mark: - CompactMap
    // - ๋ฐฐ์—ด์— nil ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ œ์™ธํ•˜๊ณ  ์š”์†Œ ๋ฐ˜ํ™˜
    private func executeCompactMap() {
        let compactMapArray = arrayWithNil.compactMap { $0 }
        print(compactMapArray)
    }
    // Mark: - FlatMap
    // - 2์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
    // - nil๊ฐ’ ์ œ๊ฑฐ ์œ„ํ•ด์„œ๋Š” compactMap ์‚ฌ์šฉ
    // - flatMap, CompactMap์€ 1์ฐจ์›๋ฐฐ์—ด์ผ๋•Œ๋งŒ nil๊ฐ’ ์ œ๊ฑฐ
    private func executeFlatMap() {
        let flatMapArray = twoDimensionalArrayWithNil
            .flatMap { $0 }
            .compactMap { $0 }
        print(flatMapArray)
    }
}

Map

  • ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜

Reduce

  • ์ดˆ๊ธฐ์›์†Œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๊ณ , ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ํ•ฉ์ณ์„œ ๋ฐ˜ํ™˜

Filter

  • ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ๊ณ  True์ธ ์š”์†Œ ๋ฐ˜ํ™˜

CompactMap

  • ๋ฐฐ์—ด์— nil ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ œ์™ธํ•˜๊ณ  ์š”์†Œ ๋ฐ˜ํ™˜

FlatMap

  • 2์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
  • nil๊ฐ’ ์ œ๊ฑฐ ์œ„ํ•ด์„œ๋Š” compactMap ์‚ฌ์šฉ
  • flatMap, CompactMap์€ 1์ฐจ์›๋ฐฐ์—ด์ผ๋•Œ๋งŒ nil๊ฐ’ ์ œ๊ฑฐ

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๋Š”(?!) ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ทธ ๊ธฐ์ค€์€ ๋ชจํ˜ธํ•˜์ง€๋งŒ

๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์„ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์žˆ์–ด์š”...

๋‹จ์ˆœํžˆ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ์‚ฌ์šฉ์„ ํ•˜๋Š” ๊ฒƒ์€ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์ฃ !!

์šฐ๋ฆฌ๋„ ์ด์ œ ์•Œ์•˜์œผ๋‹ˆ ๊ธฐ์กด์— ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ž˜ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค ๐Ÿ™‚

 

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค~!

 

๊นƒํ—ˆ๋ธŒ

์•„๋ž˜ ๋งํฌ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•ด๋ณธ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ฐธ๊ณ ํ•˜์‹œ๋ ค๋ฉด ์•„๋ž˜ ๋งํฌ๋กœ ๊ฐ€์ฃผ์„ธ์š”!

https://github.com/Taehyeon-Kim/iOS-Wiki/tree/master/HigherOrderFunction