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

[함수형 사고] 3장 양도하라

by hs_seo 2019. 3. 8.

컴퓨터의 성능이 향상되고 런타임의 처리 성능이 향상됨에 따라 개발자는 가비지 콜렉션 같은 저수준의 세부사항 조작을 더 이상 신경쓰지 않고, 고수준의 처리 로직만 고민하면 되게 되었습니다. 함수형 언어에서 이를 지원하는 네가지 방식을 살펴 보겠습니다. 

반복처리에서 고계함수로(명령형에서 서술형으로)

for문을 이용한 반복 처리 대신 map과 같은 함수를 이용하여 반복 처리의 제어를 런타임에 넘길 수 있습니다. 고계함수로 반복 처리할 연산이 무엇인지 알려주면 런타임이 효율적으로 이를 처리하여 줍니다. 병렬처리를 원한다면 par, parallelstream을 이용하면 스레드 관리를 신경쓰지 않아도 처리해줍니다.


멀티스레드 관리는 코드를 짜기도 어렵고 디버그 하기도 어려워서 오류가 많이 발생합니다. 하지만 함수형 언어에서는 구문을 하나만 추가하면 런타임이 알아서 관리 해줍니다.


그렇다고 개발자가 저수준 추상 단계에서 코드가 어떻게 동작하는지 이해하지 않아도 되는 것은 아닙니다. 코드의 동작 방식을 이해하면 더 효율적으로 구성할 수 있습니다. 작업의 세부사항은 런타임에 맡기지만 동작방식에 대해서는 이해하고 있어야 합니다. 

클로저

클로저는 지연 실행의 좋은 예이다. 클로저 블록에 코드를 바인딩함으로써 그 블록의 실행을 나중으로 연기할 수 있다. 


명령형 언어는 상태로 프로그래밍 모델을 만든다. 그 좋은 예가 매개변수를 주고받는 것이다. 클로저는 코드와 문맥을 한 구조로 캡슐화해서 행위의 모델을 만들 수 있게 해준다. 이렇게 만들어진 클로저는 마치 전통적인 자료구조처럼 주고받을 수도 있고, 적절한 시간과 장소에 실행할 수도 있다.


스칼라를 이용한 클로저는 다음과 같이 사용합니다. 



커링

커링은 팩토리 함수를 구현할 때나 템플릿 메서드 패턴을 생성할 때, 묵시적인 값을 추가할 때 이용하면 효율적이다. 스칼라를 이용한 커링(currying)은 다음과 같이 사용합니다. 



스트림과 작업 재정렬

명령형에서 함수형 스타일로 바꾸면 런타임이 효율적인 결정을 할 수 있게 됩니다. 다음의 코드에서 filter를 map 보다 먼저 처리하면 전달되는 데이터의 사이즈가 줄어서 좀 더 효율적으로 처리될 것입니다. 함수형 언어의 작업들은 지연 처리를 하여, 작업을 시작하기전에 효율적인 작업 플랜을 구성합니다.


list.map(x -> x.capitalize).filter(_.length > 1).mkString(",")

정리

이상의 방법들로 함수형 언어는 작업시간의 최적화가 가능합니다. 이를 통해 런타임에 처리 가능한 것들은 런타임에 양도하여 저수준의 세부사항은 버리고 문제를 처리하기 위한 프로세스 구현에 집중할 수 있습니다.


스칼라 클로저 참고: 바로가기

스칼라 커링 참고: 바로가기

빅데이터를 위한 스칼라 커링, 클로저 참고하기


반응형