Martin Odersky의 Functional Programming Principles in Scala 강의를 공부하며 정리했습니다.
프로그래밍 패러다임
프로그래밍의 기본적인 세 가지 패러다임
- 명령형 프로그래밍
- 함수형 프로그래밍
- 논리형 프로그래밍
객체지향 프로그래밍은 세 가지 패러다임에 직교 관계로 세 가지 패러다임과 함께 할 수 있다.
명령형 프로그래밍
- 변수를 조작
- 할당
- if-thgn-else, loops, break, continue, return 등의 제어 구조를 가짐
폰 노이만 구조의 명령 시퀀스를 보면 쉽게 이해할 수 있다.
변수 - 메모리 셀
변수 역참조 - 로드 명령
변수 할당 - 저장 명령
제어 구조 - 점프
함수형 프로그래밍
John Backus는 이러한 프로그램 구조를 글자 하나하나에 매칭시키고 싶지 않았고 더 큰 구조에서 사고하고 싶어했다. 그는 명령형 프로그래밍이 한계에 다다를 것이라고 주장하며 집합, 다형식, 기하도형, 문자열 문서 등과 같이 고수준의 추상화 정의를 위한 기술이 필요하다고 생각하였다.
이론(Theory)
- 하나 혹은 그 이상의 데이터 타입
- 이러한 타입들에 대한 동작
- 값과 동작의 관계를 설명하는 법칙
일반적으로 theory는 가변(Mutation)에 대해서는 다루지 않는다.
예를들어 다항식의 이론(Theory)에서1
(a*x +b) + (c*x +d) = (a+c)*x + (b+d)
다항식이 동일함을 유지하면서 계수를 바꾸기 위한 연산자는 정의하지 않는다.
문자열을 예로 들어보자 ++을 문자열을 연결하는 연산자라고 할 때1
(a ++ b) ++ c = a ++ (b ++ c)
에서 Theory에서는 문자열 원소의 값을 바꾸는 연산자는 정의하지 않는다. (자바와 같은 일부 언어에서는 문자열이 불변함을 유지하긴 한다.)
프로그래밍에서 수학 이론(Theory)를 따르기
- 이론에서 가변은 허용되지 않으며
- 가변은 이론에서 제공하는 유용한 법칙들을 파괴한다.
그러므로 새로운 스타일의 프로그래밍은
- 햠수로 표현되는 연산자들을 위한 이론을 정의하는데 집중해야 한다.
- 가변을 쓰지 않는다.
- 함수를 추상화하고 함수 합성을 위한 방법들을 갖는다.
함수형 프로그래밍
엄격한(Restriced) 관점, 관대한(Wider) 관점
- 엄격한 관점의 함수형 프로그래밍은 변수가 없고, 값 할당이 없고, 반복문, 명령형 제어 구조가 없다.
- 관대한 관점의 함수형 프로그래밍은 프로그래밍에서 함수에 집중한다는 것이다.
- 구체적으로 함수는 변수가 될 수 있고 생산되고 소비되며 합성될 수 있다.
- 이러한 것들은 모든 프로그래밍 언어에서 가능하나 함수형 프로그래밍 언어에서 더욱 쉽게 가능하다.
함수형 프로그래밍 언어
함수형 프로그래밍 언어에서 함수는 일급 객체(first-class citizen)이다.
- 함수는 함수 안을 포함해서 어디에서나 정의될 수 있다.
- 다른 값과 같이 인자로 전달될 수 있고 결과로 리턴될 수 있다.
- 그리고 변수들과 같이 함수를 더 큰 함수로 합성하는 연산자들도 있다.
엄격한 관점에서의 함수형 프로그래밍 언어
- Pure Lisp, XSLT, XPath, Xquery, FP
- Haskell (without I/O Monad or UnsafePerformIO)
관대한 관점에서의 함수형 프로그래밍 언어
- Lisp, Scheme, Racket, Clojure
- SML, Ocaml, F#
- Haskell (full language)
- Scala
- Smalltalk, Ruby
왜 함수형 프로그래밍 인가?
함수형 프로그래밍은 다음의 이유들로 대중화 되고 있다.
- 더 단순한 추론 원리를 가진다.
- 모듈화가 잘 된다.
- 멀티코어, 클라우드 컴퓨텅에서 병렬성을 활용하기 좋다.
(https://www.youtube.com/watch?v=3jg1AheF4n0에 더 자세히 설명되어 있다.)
end
Author: dbgsprw
Link: https://dbgsprw.github.io/2020/03/12/스칼라-함수형-프로그래밍/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.