본문 바로가기
개발/iOS

Swift 함수 2 - 함수형 프로그래밍?

by lucidmaj7 2019. 12. 1.
728x90
반응형

 

0. 함수형 프로그래밍???

 

Swift코드를 처음 접하게 된다면 적지 않게 난감한 코드가 눈에 들어오는데 바로 함수이다.

앞서 포스팅한 함수는 기존 여타 다른 언어들(절차지향적 언어, 명령형언어 java, C 등등)과 마찬가지 수준이지만 오늘 공부한 함수는 바로 함수형 프로그래밍의 페러다임에 따라 다양한 함수의 사용성을 공부해보고자 한다.

나는 주로 현업에서 Windows 시스템 프로그래밍을 하고 있는 개발자 이기 때문에 C, C++문법에 좀 더 익숙하다. 이런 관점에서 봤을 때 함수형 프로그래밍 언어인 스위프트를 봤을 때 상당히 낯설다.

이론적으로 찾아보면 함수형 프로그래밍의 가장 큰 특징은 프로그램의 상태에 관계없이 항상 같은 결과를 얻어낼 수 있다는 점이다. 이게 무슨말인지 함수형 프로그래밍을 해보지 않고는 이해갈 수 없다 생각한다.

기존의 명령형 프로그래밍, 객체지향 프로그래밍에서는 특정 변수에 따라 객체의 상태가 변하게 되고 그에 따라 프로그램의 상태가 변하게 된다. 어떤 클래스의 멤버 변수에 따라 클래스의 맴버함수의 결과가 다르게 된다. 이러한 특성들은 멀티 쓰레딩 환경에서 동기화 문제를 발생시키고 프로그래머가 실수하고 버그를 생산하게 한다. 때로는 락(lock)에 의한 성능저하도 불가피하다.

이런 문제점을 해결하고자 함수형 프로그래밍 페러다임이 각광받고 있다. 함수형프로그래밍은 함수에 인풋에 따라 아웃풋이 일정하게 나오므로 프로그램 상태에 따라 함수의 결과가 달라지지 않는다. 이러한 점은 프로그램을 이해하기 쉬워지게 하며 동작을 예측하기 쉬워진다. 또 멀티 스레딩 환경에서 쓰레드 세이프 하게 동작하게 해준다.

나 역시 함수형 프로그래밍을 많이 해보지도 않은 입문자 입장에서 설명하므로 더 이상 자세하게 설명하는게 불가능하다. 느낌만 갖고 진입해보고자 한다. 

https://www.youtube.com/watch?v=XoH9jzblxKQ

포프티비

 

https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

함수형 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래밍은 함수의 응용을 강조한다. 프로그래밍이 문이 아닌 식이나 선언으로 수행되는 선언형 프로그래밍 패러다임을 따르고 있다.[1] 함수형 프로그래밍은 1930년대에 계산가능성, 결정문제, 함수정의, 함수응용과 재귀를 연구

ko.wikipedia.org

 

2. Swift에서 함수는 1급 객체(First Class Citizen)

갑작스럽게 등장한 1급 객체란 단어. 생소하기만 하다. 

컴퓨터 프로그래밍 언어 디자인에서
일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.
https://ko.wikipedia.org/wiki/%EC%9D%BC%EA%B8%89_%EA%B0%9D%EC%B2%B4
 

일급 객체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨터 프로그래밍 언어 디자인에서, 일급 객체(영어: first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다. 1960년대, 영국의 컴퓨터 과학자 크리스토퍼 스트래치는 알골의 실수와 프로시저를 비교함으로써 일급 및 이급 객체의 개념에 대해 처음으로 언급하였다.

ko.wikipedia.org

1급 객체의 권리는 아래와 같다.

로빈 포플스톤은 일급 객체를 구성하는 요소는 기본적인 권리가 있다는, 다음의 정의를 내렸다.

1. 모든 요소는 함수의 실제 매개변수가 될 수 있다.
2. 모든 요소는 함수의 반환 값이 될 수 있다.
3. 모든 요소는 할당 명령문의 대상이 될 수 있다.
4. 모든 요소는 동일 비교의 대상이 될 수 있다.

위에 인용한 문구가 바로 사전적 의미의 1급 객체이다. 즉 나는 이미 1급 객체를 사용하고 있었었다. C언어에서 정수형 변수를 할당하고 함수의 파라미터로 전달하고, 리턴받고 이 모든게 1급 객체를 다루고 있었다.

스위프트에서는 함수가 그런데 일급객체라고 한다.  함수를 변수에 저장하고, 함수의 결과로 리턴되고, 비교될 수 있는 그런 일급객체라는 소리다.

 

3. 함수를 변수에 저장할 수 있다.

C언어에서도 함수를 변수에 저장 할 수 있다. 함수 포인터를 통해 함수의 주소를 저장하여 호출할 수는 있었다. 하지만 그것은 단지 함수의 주소를 저장 하는 것 일 뿐?

swift에서 변수를 선언하기 위해선 어떻게 하였는가?

import Foundation

var f : Int
f = 5
print(f)

var [변수명] : [자료형] 이렇게 저장하였다. 함수를 변수에 넣고 싶다면 똑같다. 

import Foundation

//함수 선언
func sum(a: Int, b: Int) -> Int
{
    return a+b
}

//함수 변수 선언
var f:( Int, Int) -> Int 
//함수 저장
f = sum

//호출
print(f(5,5))

함수의 인자, 반환값을 선언후 위와 같이 선언하면 함수를 변수에 할당 할 수 있고 호출도 가능하다.

 

4. 함수를 함수의 파라미터로 

함수가 변수에 저장되었다. 함수를 함수의 파라미터로도 전달 할 수 있다.

import Foundation

//함수 선언
func sum(a: Int, b: Int) -> Int
{
    return a+b
}


//함수를 인자로 전달하기
func sumsum(sumfunc: (Int, Int) -> Int, a: Int, b: Int) -> Int
{
    //전달된 함수 호출
    return sumfunc(a,b)
}

print( sumsum(sumfunc: sum, a: 5, b: 6))

위와 같이 함수를 인자로 전달할 수도 있다.

이상 함수형프로그래밍을 위한 swift의 함수 문법에 대해 알아보았다.

 

728x90
반응형

댓글