View

300x250

함수형 언어가 뭘까?

내 주변의 컴덕 친구들이 iOS의 언어인 swift에 대한 이야기를 할 때 ''함수형 프로그래밍'', ''함수형 언어'라는 말을 자주 들었다. 내가 이용하는 프로그래밍 언어가 함수형 프로그래밍인지, 함수형 프로그래밍이 도대체 뭔지 관심이 생겨 한 번 찾아보았다.

 

명령형 프로그래밍과 함수형 프로그래밍

우선 내가 이제껏 사용해오던 프로그래밍 언어 Java, C#등은 명령형 프로그래밍이라고 보면 될 것 같다. 명령형 프로그래밍은 '명령을 수행'하는데 초점이 맞추어져있고 함수형 프로그래밍은 '함수형식을 유지'하는데 초점이 맞추어져있다고 생각된다.

 

명령형 프로그래밍은 입력, 출력의 유무에는 크게 상관이 없이 필요한 동작을 수행하기 위해 내부적으로 값에 접근해 사용해도 상관이 없다. 다시 말하면, 인자로 넣어주지 않은 데이터의 값이 바뀌어도 상관이 없다. 그러나 내부에서 어떤 값에 접근을 하는지 모르기때문에, 같은 값을 인자로 넣어줘도 상황에 따라 다른 결과를 보일 수 있다.

 

함수형 프로그래밍은 내부적으로 돌릴 때 필요한 데이터가 인자를 통해 전달된다. 다시 말하면, 함수의 출력값이나 동작결과는 인자에 의존한다는 것이다. 또한, 함수를 통해서 내부적으로 돌아가는 환경의 값이 바뀌지는 않기에, 함수의 실행이 전체 프로그램에 어떤 영향을 끼치지 않는다. 물론 인자가 길어지고 복잡해지겠지만, 프로그램 동작의 예측가능성을 끌어올리고 이해를 쉽게 하기 위해 함수형 프로그래밍을 사옹한다.

 

명령형 프로그래밍에서 같은 인자를 넣어줘도 결과가 바뀌는 것을 함수형에서는 부작용(side-effect)이 발생한다고 표현한다. 함수형 프로그래밍은 이 부작용을 최소화 *또는 *부작용을 없애는 것을 목표로 하여 결과를 균일하게 유지하고자 한다. 이렇게 만들어준 (1) 동일입력-동일결과, (2) 프로그램의 실행에 영향을 미치지 않는 함수를 순수함수라고 칭한다. 함수형 프로그래밍의 목표를 순수함수만으로 프로그램을 작성하는것이라고 봐도 무방할 것 같다. 만약 프로그램이 순수함수로만 구성되어있다면 서로가 참조하는 내용을 방해하지 않으므로 병렬적으로 작업을 수행해도 전혀 무리가 없다. ( 병렬프로세싱에서 발생하는 DeadLock같은 문제를 해결할 수 있는 방법이라 생각된다! )

 

그렇지만, 함수형 프로그래밍도 값을 변경하는 작업은 필요할 수 밖에 없기 때문에 기존 데이터의 복사본을 만들어주는 도구들이 함수형 언어에 기본적으로 포함되어있다. 또, 새로운 함수를 만들어내기 위해 둘 이상의 함수를 조합하여 더 큰 형태의 합성함수를 구성하여 프로그램에 사용할 수도 있다.

 

그래서 함수형 프로그래밍이란?

"순수함수를 만들고 조합하여 부작용을 피해 프로그램을 작성하는 방법" 그리고 동작에 집중하는 명령방식이 아니라 무엇을 처리할 것인가에 대해 집중하는 선언형 프로그래밍 방식이라고 말하고싶다.

순수함수라는 특징있는 녀석을 이용해 수학시간에 배운 "하나의 값이 함수에 들어가면 늘 같은 값을 뱉어내야한다"라는 함수의 특성을 그대로 따라간다. 그렇기에 예측가능하고 부작용이 적다.

 

왜 이걸 써야하지?

위에서 언급했듯이, 동시에 여러 프로세스를 작업시킬때 유용하게 사용된다. 만약 함수형 언어가 아닌 명령형 언어로 프로그램을 작성했다면 한 프로세서가 실행한 메서드에 의해 개발자 모르게 내부적으로 특정 변수의 값이 바뀌게 되고 이로 인해 환경이 변해 다른 메서드의 실행결과가 완전히 달라질 수 있다. ( 캐쉬메모리에서 수정된 메모리 값이 메인메모리에 아직 반영이 안되었는데 다른 CPU가 메인메모리에서 해당 값을 참조해가는 것과 같은 문제라고 생각된다. ) 이러한 문제는 내부 값을 변경할 일이 없는 함수형 언어로 작성된 프로그램에 의해 해결가능하다.

 

또한, 개발자는 함수를 사용할 때 입력과 출력에 대한 책임만 지면 된다. 내부에서 값이 바뀌지 않기 때문에 문제가 발생한 경우 입출력값에 대한 테스트만 진행하여도 되고, 함수명이나 시그니처를 좀 더 의미있게 작성할 수 있다.

 

함수를 값처럼 사용하여 입력 또는 출력을 함수로 처리하여 간결한 코드를 작성할 수 있다. ( 이 부분에 대해서는 더 공부가 필요한 것 같다. 나중에 swift같은 함수형 언어를 공부하게 되면 기억해두었다가 공부하여 포스팅을 하겠다. )

 

정리

함수형 프로그래밍은 복잡해지는 프로그램에 맞춰 점점 발전되고 있는 방식이라고 생각된다. 지금은 '특정 언어가 함수형 언어다!'라고 말이 나오는 것처럼 특징인 듯 보이지만 점점 기술이 발전되는 상황과 Java, C#, JavaScript 같은 명령형 언어에도 함수형 언어의 특징을 계승하는 기능들이 추가되고 있는 것을 보면 이 내용이 점점 개발에 중요한 영향을 끼치고 있는 듯 하다. 나중에 현업에 투입될 나이가 되면 이 내용이 기본적인 지식이 되어있을 것 같은 느낌이 든다. 잘 공부해두는 편이 좋을 듯 하다.


참고한 자료

https://ko.wikipedia.org/wiki/함수형_프로그래밍

https://medium.com/@jooyunghan/함수형-프로그래밍이란-무엇인가-fab4e960d263

https://velog.io/@kyusung/함수형-프로그래밍-요약

http://ruaa.me/why-functional-matters/

320x100
Share Link
reply
반응형
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31