본문 바로가기
개념/함수형사고

[함수형 사고] 5장 진화하라

by hs_seo 2019. 3. 12.

함수형 언어에서의 코드 재사용은 객체지향 언어와는 접근 방법이 다릅니다. 객체지향 언어는 많은 자료구조와 거기에 딸린 연산을 포함하는 클래스를 이용합니다. 함수형 언어는 적은 수의 자료구조(list, set, map)와 공통된 연산(filter, map, reduce)을 제공하고 사용자가 특정한 경우에 맞는 함수를 제공하여 작업을 커스터마이즈함으로써 재사용을 장려합니다.


함수형 언어가 소프트웨어에서 반복되는 문제들의 해결방법을 어떻게 진화시켜 왔는지 알아보겠습니다.


적은 수의 자료구조, 많은 연산자

100개의 함수를 하나의 자료구조에 적용하는 것이 10개의 함수를 10개의 자료구조에 적용 하는 것보다 낫다. -앨런 펄리스

객체지향 언어에서는 특정한 메소드가 구현되 자료구조를 개발자가 만들기를 권장합니다. 예를 들어 자바에서는 XML 파싱의 경구 SAX, DOM 파싱을 위한 개별 클래스가 존재합니다. 함수형 언어에서는 특정한 클래스를 이용하지 않고 일반 자료구조(Map)와 함수를 이용하여 처리합니다.


문제를 향하여 언어를 구브리기

문제를 프로그램에 맞추지 말고, 프로그램을 문제에 맞게 조정해라.


문제를 언어에 맞게 변경하지 않고, 언어를 문제에 어울리게 변경하는 것을 선호합니다. 루비나 스칼라 같은 도메인 특화 언어(DSL)들이 이를 잘 지원합니

다. 연산자 오버로딩이나 묵시적 자료형을 이용하여 문제에 맞게 변형합니다.


디스패치 다시 생각하기

언어가 작동 방식을 동적으로 선택하게 하라.

if 문을 길게 연결하면 가독성이 떨어지게 되어 자바 개발자들은 주로 팩토리 패턴을 생성하게 됩니다. 좀더 유연하게 결정을 표현할 수 있는 언어를 사용하면 이런 패턴을 사용하지 않고도 간결하게 코드를 짤 수 있습니다. 예를 들어 그루비에서는 switch 문의 조건을 동적으로 표현할 수 있습니다. A에서 B사이의 값을 지정하여 처리 할 수 있기 때문에 자바에 비해 효율적으로 표현할 수 있습니다.


연산자 오버로딩

+,-* 연산자를 오버로딩 하여 각자의 문제 도메인에 적합한 연산을 새로 만들어 적용할 수 있습니다. 예를 들어 복소수(복소수는 실수와 허수로 표현되는 개념)의 연산을 표현할 때 새로운 클래스나 메소드를 만들지 않고, 연산자를 오버로딩하여 문제를 해결할 수 있습니다 .



함수형 자료구조

자바에서는 언어 자체의 예외 생성 및 전파 기능을 사용하는 전통적인 방법으로 오류를 처리합니다. 하지만 함수형 언어들은 예외 패러다임을 지원하지 않기 때문에 개발자는 다른 방법으로 오류 조건을 표현합니다. 주로 한번에 여러개의 값을 반환할 수 있는 자료구조를 통해 이를 표현합니다. 스칼라의 Option, Either와 같은 자료구조를 이용하여 값을 가져올때 getOrElse() 함수를 이용하여 처리합니다.



반응형