(자바8 - 함수형 프로그래밍 기법)

함수를 마치 일반값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료구조에 저장할 수 있음을 의미한다.
일반 값처럼 취급할 수 있는 함수를 일급 함수라고 한다.
바로 자바8이 이전버전과 구별되는 특징 중 하나가 일급 함수를 지원한다는 점이다.
자바8에서는 ::연산자로 메서드 레퍼런스를 만들거나 (int x) -> x + 1 같은 람다표현식으로 직접 함숫값을 표현해서 메소드를 함숫값으로 사용할 수 있다.

자바8에서는 다음과 같은 메서드 레퍼런스로 Integer.parsetInt를 저장 할 수 있다.

Function<String, Integer> strToInt = Integer.parseInt

1. 고차원 함수




2. 커링

대부분 애플리케이션은 국제화를 지원해야 하는데 이때 단위 변환 문제가 발생할 수 있다.
보통 변환요소와 기준치 조정요소가 단위 변환 결과를 좌우한다.
다음은 섭씨를 화씨로 변환하는 공식이다.

CtoF(x) = x*9/5 + 32

다음과 같은 패턴으로 단위를 표현할 수 있다.
1. 변환요소를 곱함
2. 기준치 조정요소를 적용

static double converter(double x, double y, double f) {
  return x * f + b;
}

위와같이 하면 인수에 변환요소와 기준치를 넣는 일은 귀찮은 일이며 오타도 발생하기 쉽다.

다음은 커링이라는 개념을 활용해서 한 개의 인수를 갖는 변환 함수를 생산하는 '팩토리' 를 정의하는 코드이다.

static DoubleUnaryOperator curreidConverter(double f, double b) {
 return (Double x) -> x * f +b;
}

위 메소드에 변환요소(f)와 기준치 (b) 만 넘겨주면 우리가 원하는 작업을 수행할 함수가 반환된다.
예를들어, 다음은 팩토리를 이용해서 원하는 변환기를 생성하는 코드다.

DoubleUnaryOperator convertCtoF = curreidConverter(9.0/5, 32);
DoubleUnaryOperator convertUSDtoGBP = curreidConverter(0.6, 0);
DoubleUnaryOperator convertKmtoMi = curreidConverter(0.6214, 0);

DoubleUnaryOperator은 applyAsDouble이라는 메소드를 정의하므로 다음처럼 변환기를 사용할 수 있다.

double gdp = convertUSDtoGBP.applyAsDouble(1000);


댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기