Link
Today
Total
12-23 06:23
Archives
관리 메뉴

초보개발자 긍.응.성

(모던 자바 인 액션) Chapter 19 함수형 프로그래밍 기법 본문

책 정리/모던 자바 인 액션

(모던 자바 인 액션) Chapter 19 함수형 프로그래밍 기법

긍.응.성 2021. 1. 1. 18:41
반응형

이번 장에서는 고급적인 함수형 프로그래밍 기법을 소개한다.

고차원 함수(higher-order functions)

함수를 인수로 받아서 다른 함수로 반환하는 정적 메서드를 고차 함수라고 부른다. 고차원 함수를 적용할 때 어떤 인수가 전달될지 알 수 없으므로 인수가 부작용을 포함할 가능성을 염두에 두어야 한다. 따라서 인수로 전달된 함수가 어떤 부작용을 포함하게 될지 정확하게 문서화하는 것이 좋다.

커링(currying)

커링은 x와 y라는 두 인수를 받는 함수 f를 한개의 인수를 받는 g라는 함수로 대체하는 기법이다. 이때 g라는 함수 역기 하나의 인수를 받는 함수를 반환한다. 이때 함수 g의 상태는 여러 과정이 끝나지 않은 상태를 가리켜 '함수가 부분적으로(partially) 적용되었다'라고 말한다.

커링은 함수를 모듈화하고 기존 변환로직을 재활용할 수 있도록 하는 기법이다.

영속(persistent) 자료구조

함수형 프로그램에서 사용하는 자료구조는 영속 자료구조이다. 영속 자료구조는 갱신될 때 기존 버전의 자신을 보존한다. 결과적으로 자신을 복사하는 과정이 따로 필요하지 않다. 계산 결과를 표현할 자료구조가 필요하면 기존 자료구조를 갱신하지 않도록 새로운 자료구조를 만들어야 한다. 대신 전체를 새로 만드는 것이 아닌 인수를 이용하여 가능한 한 많은 정보를 공유하도록 만드는 것이 중요하다.

함수형 자료구조에서 말하는 영속은 저장된 값이 다른 누군가에 의해 영향을 받지 않는 상태를 말한다. 그렇기 때문에 결과 자료구조를 바꾸지 않아야 하는 것이다.

스트림의 자기참조

스트림은 단 한 번만 소비할 수 있다. 그렇기에 자바의 스트림은 재귀적으로 자신을 정의할 수 없다.

게으른 평가(lazy evaluation)

자바에서는 메서드를 호출하면 모든 인수가 즉시 평가된다. 하지만 스트림에서는 연산을 적용하면 바로 수행되지 않으며, 최종 연산을 적용해서 실제 계산을 해야 하는 상황에서만 실제 연산이 이루어진다. 이 이유는 스트림의 인자가 함수이기 때문이다.

자바 8 이후 함수가 일급 시민이 되면서 함수를 자료구조 내부로 추가할 수 있으며, 이런 함수는 자료구조를 만드는 시점이 아니라 요청 시점에 실행된다. 함수형 인터페이스인 Supplier <T>를 이용하여 게으른 자료구조를 만들 수 있다. Supplier 함수를 호출함으로 자료구조의 요소를 생성하는 것이다.

패턴 매칭(pattern matching)

함수형 프로그래밍의 중요한 특징으로는 패턴 매칭을 들 수 있다. 이는 정규표현식과 관련된 매칭과는 다르다. 여기서의 패턴 매칭은 한 개 이상의 파라미터에 대한 멀티 매칭을 의미한다. 자바에서는 패턴 매칭 대신 if-then-else 구문을 중첩하여 구현할 수 있지만, 스칼라에서는 이미 패턴 매칭을 지원하고 있다. 쉽게 표현하면 다수준(multilevel)의 switch 문이라고 설명할 수 있다. 아래 예제를 통해 패턴 매칭이 무엇인지 이해할 수 있다.

def simplifyExpression(expr: Expr): Expr = expr match {
	case BinOp("+", e, Number(0)) => e  // 0 더하기
	case BinOp("*", e, Number(1)) => e  // 1 곱하기
	case BinOp("/", e, Number(1)) => e  // 1 나누기
	case _ => expr  // expr을 단순화할 수 없다
}

자바에서 함수형 프로그래밍을 통해 패턴 매칭을 흉내 낼 수 있다.

캐싱(caching) 또는 기억화(memorization)

참조 투명성이 유지되는 상황이라면 기억화를 이용하여 추가 오버헤드를 피할 수 있다. 기억화는 메서드에 래퍼로 캐시를 추가하는 기법이다.

'같은 객체를 반환함'의 의미

참조 투명성은 '인수가 같다면 결과도 같아야 한다'라는 규칙을 만족해야 한다. 하지만 논리적으로 같은 데이터이나 같은 참조를 갖지 않으면 서로 다른 참조이므로 == 연산이 성립되지 않는다. 그러나 자료구조를 변경하지 않는 상황에서 참조가 다르다는 것은 큰 의미가 없으며 논리적으로 같기에, 함수형 프로그래밍에서는 구조적인 값이 같다면 둘은 같은 객체라고 할 수 있다.

콤비네이터

함수형 프로그래밍에선 함수를 인자로 받고 조합하며 결과로 함수를 반환하는 형식의 고차원 함수를 많이 사용하게 된다. 이처럼 함수를 조합하는 기능을 콤비네이터라고 부른다.

반응형
Comments