Swift Functional Programming

함수형 프로그래밍이란?

말 뜻을 그대로 이해하면 함수를 사용한 프로그래밍이라고 할 수 있습니다. 함수를 사용하면 어떤 장점이 있는지 우리는 이미 알고 있습니다.

함수형 프로그래밍은 자료처리를 수학적 함수의 계싼으로 취급 상태(State) 와 가변 데이터를 지양하는 프로그래밍

함수형 프로그래밍의 사전적 정의는 이렇습니다.

함수형 프로그래밍을 이해하기 위해서는 명령형(Imperative) 프로그래밍 과 선언형(Declarative) 프로그래밍에 대해 예를 들어보겠습니다.

명령형(Imperative) 프로그래밍

명령형 프로그래밍이라고 뭔가 거창해 보이지많은 너무나도 잘 알고 있는 기법입니다. 시간의 순서 대로 명령을 내리면서 프로그래밍을 진행하는 것을 말합니다. 동물의 종류를 갖는 배열 하나를 선언해 보겠습니다.

var zoo: [String] = ["개","말","돼지","새","개","돼지","개","말","새","고양이"]
// 여기서 우리는 댕댕이를 찾고 싶습니다!  

var findDog: [String] = []
for animal in zoo {
  if animal == "개" {
    findDog.append(animal)
  } else {
    print("댕댕이가 아닙니다.")
  }
}

이런식으로 animal은 zoo 배열을 하나 씩 뒤지면서 개를 찾습니다 그리고는 findDog이라는 배열에 추가를 합니다. 이런식의 방법은 일단 보기에는 직관 적일 수는 있으나 프로그래밍을 하는 입장에는 아마 별로 좋지 않은 방법입니다.

선언형(Declarative) 프로그래밍

함수형 프로그래밍은 선언적이라고 합니다. 위의 코드(명령형)는 별로좋지 않은 방법이라 했습니다. 그러면 Swift 의 선언형 프로그래밍을 적용 시키면 어떻게 되는지 보겠습니다.

stringFilter(animal: zoo, returnBool: { $0 == "개" }

너무 간결하고 “아는만큼 눈에 보인다!” 라듯이 위의 코드가 얼마나 파워풀! 한지 아실 수 있습니다. 명령형과 선언형을 비교해보겠습니다.

  • 명령형은 “단계별로 어떤 명령을 수행해야 하는가” 에 초점을 둡니다.

  • 선언형은 “원하는건 준비 되어있고 이 다음에 수행해야 할 것은?” 에 초점을 둡니다.

위의 코드에서 명령형의 경우에는 할당(assignment)로 데이터의 상태를 바꾸는 작업이 이루어 졌습니다

선언형의 경우에는 할당의 작업이 이루어 지지 않았습니다. 즉 상태관리가 필요없다는 말입니다.

클로저의 개념인 $0의 사용으로 매개변수의 불필요한 선언도 줄여 간결해졌고 그로인해 코드가 매우 직관적이고 짧아졌습니다

배열 filter 에 대해서 조금더 예를 들어 보겠습니다.

var evens = [Int]()
for i in 1...10 {
  if i % 2 == 0 {
    evens.append(i)
  }
}

함수형 프로그래밍을 사용하지 않고 단순 명령형으로 짝수를 찾아 배열 evens에 추가하는 코드입니다.

  1. 가변의(mutable) 빈 배열 evens 생성

  2. loop 시작

  3. if 짝수 이면 값을 배열에 append

단계별로 명령에 초점이 맞추어져 진행 되는 모습을 볼 수 있습니다. 기조의 C언어로 CSE의 기초를 다지 신 분들이라면 이 방법이 전통적인 방법이고 결코 잘못된 방법은 아닙니다 명령형또한 매우 중요한 개념중에 하나죠!

아무튼 이를 이제 함수형 filter 로 변경 해 보겠습니다

func isEven(number: Int) -> Bool {
  return number % 2 == 0
}

evens = Array(1...10).filter(isEven)
// 우리는 클로저를 배웠기 때문에 클로저를 통해 더 간결하게 코드를 줄일수 있습니다.

evens = Array(1...10).filter{ $0 % 2 == 0 }
// isEven 이라는 함수 조차도 필요없이 말입니다 :) 굳이 필요하지않는 매개변수 선언 조차도 없애 버릴 수 있습니다.

Swift 의 함수형 프로그래밍의 특징

  1. 고차 함수(Higher-order function)
  • 함수를 다른 함수의 매개변수로 전달 할 수 있습니다.

ex) filter 함수는 isEven 함수를 매개변수로 전달 받고 있습니다.

  1. 일등 함수(First-class function)

-함수를 변수처럼 취급 할 수 있습니다. 함수를 변수에 대입하고 마찬가지로 다른 함수의 파라미터로 전달 할 수 있습니다.

  1. 클로저(Closures)
  • 익명함수

ex) filter { } 형태의 구문



© 2020. by Gaki

Powered by gaki