프로그래밍언어 자바

9. 람다와 스트림


이번 강좌에서는 함수형 프로그래밍 구문인 람다함수형 인터페이스, 그리고 스트림 API를 학습 합니다. 최신의 프로그래밍 언어에서 사용되는 구조와 기능으로 자바에서의 사용법과 활용방법을 배우게 됩니다.

이 강의를 통해 람다와 함수형 인터페이스 그리고 스트림 API를 이해하고 사용할 수 있습니다.


01: FP(Functional Programming)와 람다(Lamda)

1) 함수형 프로그래밍

함수형 프로그래밍(FP)은 순수 함수(pure function)를 조합하고 공유 상태(shared state), 변경 가능한 데이터(mutable data) 및 부작용(side-effects) 을 피하는 기본 원칙에 따라 소프트웨어를 구성하는 프로그래밍 패러다임 입니다.

객체지향은 동작하는 부분을 캡슐화해서 이해할 수 있게 하고, 함수형 프로그래밍은 동작하는 부분을 최소화해서 코드 이해를 돕는다. (마이클 페더스‘레거시 코드 활용 전략’)

함수형 프로그래밍은 명령형이 아닌 선언적 방식으로 구현되며 흐름 제어를 명시적으로 기술하지 않고 프로그램 로직이 표현된다는 것을 의미 합니다.

다음에 나오는 내용들은 함수형 프로그래밍을 위해 기본적으로 알아야 하는 개념들 입니다.

1급 객체(First object, First class citizen)

1급 함수라고도 하며 보통 자바스크립트를 배울때 많이 나오는 개념이며 함수형 프로그래밍의 전제 조건이기도 합니다. 일반적으로 다음과 같은 조건을 만족하는 객체를 말합니다.

자바스크립트의 경우 함수객체 이므로 함수가 1급 객체가 되는 것이로 자바의 경우 함수형 인터페이스(추상메서드가 하나인 인터페이스)를 통해 구현이 가능합니다.

고차함수(High Order Function)는 1급 함수의 서브셋으로 다음 조건을 만족하는 함수를 말합니다.

순수 함수(pure function)

순수 함수란 같은 입력에 대해 항상 같은 출력을 반환하는 함수로 다음과 같은 조건을 만족하는 함수를 말합니다.

합성 함수(function composition)

새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합하는 것을 말하는 것으로 데이터가 흐르도록 일련의 파이프라인을 형성하는 개념 입니다. 함수형 프로그램은 작은 단위의 순수 함수들로 구성되어 있기 때문에 이 함수들을 연속적 혹은 병렬로 호출해서 더 큰 함수를 만드는 과정으로 프로그램이 구성되어야 합니다.

실제 구현상에는 메서드 체이닝 방식으로 함수들을 연결해 사용하는 형태로 나타 납니다.

2) 람다(Lamda)

람다λ라고 표기하며 원래는 수학기호로 1930년대 수학자 알론소 처치의 람다 계산식에서 시작되었다고 합니다. 최신의 프로그램언어에서 사용되는 람다식 혹은 람다함수는 함수형 언어의 특징에서 나온것으로 나중에 한번이상 실행할 수 있는 코드블록을 말하며 실제 구현에는 익명 함수(Anonymous Function)형태로 사용 됩니다.

기본적으로 함수의 구조로 되어 있으며 보통 ->(언어에 따라 다름)와 같이 화살표 형태의 기호를 이용해 매개변수를 함수 바디로 전달하는 형태를 취합니다.

( parameters ) -> expression body       // 인자가 여러개 이고 하나의 문장으로 구성
( parameters ) -> { expression body }   // 인자가 여러개 이고 여러 문장으로 구성
() -> { expression body }               // 인자가 없고 여러 문장으로 구성
() -> expression body                   // 인자가 없고 하나의 문장으로 구성

장점

단점

최신언어 지원현황

사용 예

다음 예는 1,2,3 세개의 값을 가지고 있는 배열의 각 원소값에 자기자신을 곱한 값을 출력하는 코드 입니다. 람다를 사용하지 않을 경우 배열을 만들고 for 문의 이용해 처리해야 하는 과정을 거쳐야 합니다.

Arrays.asList(1,2,3).stream()
	.map(i -> i*i)
	.forEach(System.out::println);

// 실행결과 -> 1 4 9

참고 자료