[JAVA] 함수형 프로그래밍과 람다

JunWoo An·2023년 11월 7일
0

스파르타코딩클럽

목록 보기
14/46

하드웨어 기술의 발전 및 새로운 요구사항의 탄생으로 자바(JAVA)또한 새로운 변화를 맞이하려하고있다.

자바가 시장에서 요구하는 생태계를 맞이하기 위한 변화로는 크게 두가지로 병렬 처리와 함수형 프로그래밍이 있다. 이중 함수형 프로그래밍에 대해 다뤄볼것이다.

함수형 프로그래밍이란?

함수형 프로그래밍은 우리가 자바를 공부하면서 배운 객체지향 프로그래밍처럼 핵심 아이디어로 부터 시작한다.
객체지향 프로그래밍의 핵심 아이디어는 "프로그램을 객체들의 협력과 상호작용으로 바라보고 구현한다"이듯 함수형프로그래밍 또한 "프로그램을 순수한 함수의 모음으로 바라보고 구현한다" 여기서 키포인트는 "순수함수"라는 단어이다. 그럼 순수함수란 무엇인가?

순수함수 : 수학의 함수처럼, 특정한 데이터에 의존하지 않고, 관련없는 데이터를 변경하지도 않으며, 결과값이 오직 입력값에만 영향을 받는 함수

위 그림은 우리가 함수라는 단어를 배울때 한번쯤은 본 그림이다. 함수의 출력(결과값)은 함수의 입력(입력값)의 영향만 받고 함수자체는 상자모양처럼 외부의 영향을 받지않는 함수를 순수함수라고 이해하면된다.

그럼 순수함수를 사용해서 구현하는 함수형 프로그래밍의 장점은 아래와 같다.

  1. 검증이 쉽다 (검증이 필요한 부분만 검증 할 수 있음)
  2. 성능 최적화가 쉽다 (특정 input에 대한 output을 재사용 할 수 있음 - 캐싱)
  3. 동시성 문제를 해결하기 쉽다 (함수는 다른 값의 변경을 야기하지 않음)

객체지향 프로그래밍인 자바가 함수형 프로그래밍을 수행하기위해 어떤 기능을 도입하였는가?
우선 함수형 프로그래밍의 아이디어를 살펴보자면

"함수를 일급 값으로"
여기서 일급 값이란 "일급 객체(First Class Object)"라 불리기도 하며 정의로는

일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. [위키백과]

이러한 일급 객체의 조건으로는

변수에 할당(assignment)할 수 있다.
다른 함수를 인자(argument)로 전달 받는다.
다른 함수의 결과로서 리턴될 수 있다.

위에 대한 조건으로 인해 알 수 있는 것은 함수를 데이터(string, number, boolean, array, object) 다루 듯이 다룰 수 있다는 점이다. 자바에서는 기본값과 객체가 이에 해당한다. 그렇다면 메서드는?

메서드를 변수로 할당, 메서드를 인자로 다른메서드로, 메서드의 결과로 메서드를 반환 등 메서드는 특정한 연산을 지원하지않기때문에 2급시민으로 볼수있다. 이렇듯 메서드와는 다르게 메서드의 기능을 같는 일급 객체기능을 위해 Java 8에서는 메서드 참조가 도입되었다. 이에 관해서는 추후에 다루도록하고 또다른 아이디어인 "람다"를 다루도록 하겠다.

람다는 "익명함수"를 지칭하는 말로 익명함수는 이름이 없는 함수를 뜻하며 일급객체로 취급된다. 일급 객체는 함수를 값으로 사용할수 있으며 인자로도 사용이 가능하다. 자세한 사용법은 아래와같다

// 기본적인 람다는 아래와 같이 이루어져있다.
(parameter) -> {
	function
	return returnvalue;
}

// 이때 parameter는 없을수도 있으며 함수몸체가 단일 실행문일경우 {}을 생략할수있다. return또한 생략이가능하여 아래와같이도 표시가능하다

() -> returnvalue

이러한 람다의 장단점으로는

장점

  1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있습니다.
  2. 지연연산 수행 - 람다는 지연연상을 수행 함으로써 불필요한 연산을 최소화 할 수 있습니다.
  3. 병렬처리 가능 - 멀티쓰레디를 활용하여 병렬처리를 사용 할 수 있습니다.

단점

  1. 람다식의 호출이 까다롭습니다
  2. 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어집니다.
  3. 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어 뜨릴 수 있습니다.
profile
도전하는 사람

0개의 댓글