나의 기록, 현진록

[Swift] 1.2.2 함수형 / 함수형 프로그래밍 패러다임 본문

Programming/Swift

[Swift] 1.2.2 함수형 / 함수형 프로그래밍 패러다임

guswlsdk 2021. 7. 1. 11:46
반응형

swift 프로그래밍 3판 - 야곰 지음

 

 

함수형 프로그래밍 패러다임

함수형 프로그래밍 패러다임의 가장 큰 장점은 대규모 병렬처리가 쉽다는 점이다.

 

함수형 프로그래밍 패러다임은 프로그램이 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임이다. 기존 객체지향 프로그래밍 패러다임이나 명령형 프로그래밍 패러다임에서는 프로그램에서 값이나 상태의 변화를 중요하게 여기지만 함수형 프로그래밍 패러다임은 함수 자체의 응용을 중요하게 여긴다.

 

수학적 함수와 명령형 함수의 차이점은 코드 이해와 실행 결과의 관점에서도 큰 차이를 보입니다. 명령형 함수를 이용하는 객체지향 프로그래밍은 과거의 유산이라고도 볼 수 있는 절차지향 프로그래밍 패러다임이 포함되어 있다. 그래서 함수 실행 시 함수가 전달 받은 전달인자 외에도 포인터, 레퍼런스 값 등 객체의 상태 값(프로퍼티 값) 또는 메모리 참조 값 등이 변경될 수 있으며 함수 내부의 처리에도 영향을 미칠 수 있습니다.

 

하지만 수학적 함수를 이용하는 함수형 프로그래밍은 순수하게 함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작한다. 따라서 어떤 상황에서 프로그램을 실행하더라도 일정하게 같은 결과를 도출할 수 있습니다. 프로그램이 동작하는 흐름에서 상태(값)가 변하지 않으면 함수 호출이 각각 상호 간섭 없이 배타적으로 실행되므로 병렬처리할 때 부작용이 거의 없다. 프로세스 혹은 스레드 별로 특정 값을 참조하기 위해 락을 걸거나 대기할 필요가 없기 때문입니다. 또한 필요한 만큼 함수를 나누어 처리할 수 있도록 스케일업할 수 있기 때문에 대규모 병렬처리에 큰 강점이 있다.

 

또 다른 함수형 프로그래밍의 큰 특징은 함수를 일급 객체(First-Class Citizen)로 다룬다. 다음 조건을 모두 충족해야 일급 객체가 될 수 있다.

 

  • 전달인자로 전달할 수 있다.
  • 동적 프로퍼티 할당이 가능하다
  • 변수나 데이터 구조 안에 담을 수 있다
  • 반환 값으로 사용할 수 있다.
  • 할당할 때 사용된 이름과 관계 없이 고유한 객체로 구별할 수 있다.

 

기존의 스칼라 타입인 정수, 실수 등은 거의 모든 언어에서 일급 객체의 조건을 갖출 수 있지만, 대부분의 함수는 그렇지 않다. 하지만 스위프트의 함수는 이 조건을 모두 충족할 수 있기에 함수를 일급 객체로 취급한다.

 

함수가 일급 객체가 된다는 의미는 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 등의 동작만으로도 프로그램을 구현할 수 있다는 뜻이다.

 

 

  명령형 프로그래밍 함수형 프로그래밍
프로그래머가 초점을 두는 곳 작업 수행 알고리즘
상태의 변경 추적
원하는 정보
필요한 변환
상태 변경 중요 없음
실행 순서 중요 낮은 중요도
주요 흐름 제어 제어 구문(반복문, 조건문 등)
함수(메서드) 호출
순환(재귀) 함수 호출 등의 함수 호출로 제어
주요 조작 단위 클래스나 구조체의 인스턴스 함수

 

 

스위프트가 함수형 프로그래밍 패러다임을 차용한 의의

스위프트는 객체지향 프로그래밍 패러다임과 함수형 프로그래밍 패러다임을 모두 차용하고 있다.

 

사실 애플의 프레임워크 대부분은 객체지향 프로그래밍 패러다임을 기반으로 설계된 수많은 클래스로 구성되어 있다. 따라서 애플의 프레임워크에서 사용될 언어가 객체지향 프로그래밍 패러다임을 수용하지 않는다면 당연히 문제가 발생한다.

 

하지만 애플은 스위프트에서 함수형 프로그래밍 패러다임을 특히나 강조한다. 이는 애플의 프레임워크를 벗어나 다른 영역(예를 들어 서버용 프레임워크 등)에서 스위프트를 사용했을 떄 순수하게 함수형 프로그래밍 패러다임만으로 프로그램을 작성할 수 있기 때문이다.

 

순수하게 함수형 프로그래밍 패러다임으로 프로그램을 작성하면 다음 장점이 있다.

  • 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램을 만들기 쉽다.
  • 멀티 코어 혹은 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다.
  • 상태변화에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계할 수 있다.

 

 

반응형