- Java Functional하게 사용하기 - 52022년 02월 17일 00시 38분 53초에 업로드 된 글입니다.작성자: jCurve728x90반응형
함수형 프로그래밍을 공부하면서 scope에 대한 내용을 언급하는데
보통 scope는 변수에 접근할 수 있는 범위로 생각을 하죠
lexical scope는 뭘까요 그럼?
이는 함수 안에 함수가 있을 때 내부 함수에서 외부 함수에 있는 변수에 접근이 가능한 범위를 lexical scope라고 합니다.
위에서 처럼 내부함수에서 외부함수의 변수를 사용해서 "Hello World"라는 문자열을 만들어서 반환했는데
이렇게 내부 함수가 사용한 외부 함수의 변수들은 계속 존재하게 되고 이렇게 lexical scope를 포함하는 함수를 closure라고 한다.
이때 내부 함수가 사용한 외부 함수의 변수들은 내부 함수 선언 시점에서 변할 수 없어서 final로 만들지 않아도 암묵적인 final이 된다.
이런 closure를 응용해서 여러 매개변수를 받는 함수를 중첩된 여러 함수로 쪼개서 매개 변수를 한 번에 받지 않고
여러 단계에 걸쳐 나눠 받는 기술을 Curry라고 합니다.
위의 curriedAdd가 사용 예시죠.
다음으로 Lazy Evaluation을 살펴보겠습니다.
lambda는 계산이 그 결과값이 필요한 순간에 계산되는데 이를 이용해서 불필요한 계산을 줄이고 해당 코드의 실행 순서를 의도적으로 미룰 수 있습니다.
or 메서드에 returnTrue()와 returnFalse()를 입력에 사용하는 경우 returnTrue, False 메서드에 대한 계산을 진행한 이후 값을 인식해야 or에 대한 결과 값을 알려주게되는데 만일 이 연산이 엄청 비싼 연산이라면 비효율적이기 때문에 람다를 사용한 방식으로 성능 개선이 가능합니다.
lazyOr를 사용해서 supplier를 인자로 받아오게 되면 실제 메서드 호출시 인자에 값이 지정되는 순간에 연산이 실행되는 것이 아니라 lazyOr메서드 로직을 실행하는 시점에 연산이 실행되기 때문에 비효율이 사라집니다.
stream은 마찬가지로 lazy evaluation을 하는데
종결 처리가 이루어질 때까지 연산을 미룹니다.
마지막으로 Function Composition에 대해 알아보겠습니다.
함수 합성이라는 말 답게 여러개의 함수를 합쳐 하나의 새로운 함수로 만드는 것인데요
Function 클래스는 compose랑 andThen이라는 인스턴스 메서드가 있는데
compose는 파라미터로 들어온 값(Function)을 먼저 실행하고 andThen은 나중에 실행하는 메서드 입니다.
반응형'JAVA' 카테고리의 다른 글
java exception performance (0) 2024.01.14 BigDecimal 정리 (0) 2024.01.07 Java Functional하게 사용하기 - 4 (0) 2022.02.17 Java Functional하게 사용하기 - 3 (0) 2022.02.12 Java Functional하게 사용하기 - 2 (0) 2022.02.07 댓글