"자바 8 부터 나온 람다, 스트림 과 같은 함수형 프로그래밍의 기초적인 개념들을 정리하기 위한 글 입니다."
"더 자세한 내용은 '모던 자바 인 액션' 교재를 학습하며 포스팅 할 예정입니다."
- 함수형 프로그래밍과 람다식
보통 자바는 클래스가 없으면 메소드를 사용할 수 없는 데 반해, 함수의 구현과 호출만으로 프로그램을 만들 수 있는 프로그래밍 방식이 있다.
이를 함수형 프로그래밍 방식 이라고 한다.(FP : Functional Programming)
여기서 자바에서 제공하는 함수형 프로그래밍의 방식을 람다식 이라고 한다.
람다식은 간단히 설명하면 함수 이름이 없는 익명 함수를 만드는 것이다.
예시 : (매개변수) -> (실행문);
메소드 에서 사용하는 매개변수가 있고, 이 메소드가 매개변수를 사용하여 실행할 구현 내용, 즉 메소드의 구현부를 {} 내부에 작성한다.
예시 : 두 수를 입력받아 그 합을 반환하는 add() 함수가 있을 때 이를 람다식으로 변환
변환 전
int add(int x, int y){
return x + y;
}
변환 후
(int x, int y) -> {return x + y;}
메소드 이름 add 와 반환형 int 를 없애고 -> 기호를 사용하여 구현한다.
함수의 이름이 있는 경우와 비교하면 꽤 간결하게 느껴진다.
람다식의 특징
1. 매개변수 자료형 생략 가능
2. 매개변수가 하나인 경우 괄호 생략 가능(하나 이상인 경우 생략 불가능)
str -> {System.out.println(str);} // 문자열 하나를 매개변수로 받아 출력
(x,y) -> {System.out.println(x + y);} // 매개변수가 하나 이상일 경우 괄호를 사용해야 한다.
3. 중괄호 안의 구현 부분이 한 문장인 경우 중괄호 생략 가능(한 문장이더라도 return 문은 생략할 수 없다.)
4. 중괄호 안의 구현 부분이 return 문 하나라면 중괄호와 return 을 모두 생략하고 식만 사용한다.
람다식 활용 예제
두 개의 매개변수 중 큰 수를 반환해보자.
1. 인터페이스를 만들고, 인터페이스에 람다식으로 구현할 메소드를 선언한다.(추상 메소드)
2. 람다식을 인터페이스 형 변수에 대입 후 해당 변수에서 선언해둔 추상 메소드를 호출한다.
- MyNumber.java
@FunctionalInterface
public interface MyNumber {
int getMax(int num1, int num2); // 추상 메소드 선언
}
- TestMyNumber.java
import LambdaInterface.MyNumber;
public class TestMyNumber {
public static void main(String[] args) {
// 람다식을 인터페이스형 max 변수에 대입
MyNumber max = (x,y) -> (x >= y) ? x : y;
// 인터페이스형 변수로 메소드 호출
System.out.println(max.getMax(10, 20));
}
}
* 함수형 프로그래밍은 순수 함수(pure function) 를 구현하고 호출함으로서 외부 자료에 부수적인 영향(side-effect) 을 주지 않도록 구현하는 방식이다.
: 순수 함수란 매개변수만을 사용하여 만드는 함수이다.
즉, 함수 내부에서 함수 외부에 있는 변수를 사용하지 않기 때문에 함수가 수행 되더라도 외부에 영향을 주지 않는다.
* 객체 지향 언어가 객체를 기반으로 구현하는 방식이라면, 함수형 프로그램은 함수를 기반으로 하고, 자료를 입력받아 구현하는 방식이다.
-> 함수가 입력받은 자료 이외에 외부 자료에 영향을 미치지 않기 때문에 여러 자료를 동시에 처리하는 병렬처리에 적합하며, 안정되고 확장성 있는 프로그램을 개발 할 수 있는 장점이 있다.
또한 순수 함수로 구현된 함수형 프로그램은 함수 기능이 자료에 독립적일 수 있도록 보장한다.
(동일한 입력에 대해서는 동일한 출력을 보장하고, 다양한 자료에 같은 기능을 수행할 수 있다.)
람다식은 어디에 선언하고 구현해야 할까?
- 함수형 언어에서는 함수만 따로 호출할 수 있지만, 자바에서는 참조변수 없이 메소드를 호출 할 수 없다.
- 그렇기 때문에 람다식을 구현하기 위해 함수형 인터페이스를 만들고, 인터페이스에 람다식으로 구현할 메소드를 선언한다.
- 람다식은 하나의 메소드를 구현하여 인터페이스형 변수에 대입하므로, 인터페이스에 두 개 이상의 메소드가 있어선 안된다.
(람다식은 이름이 없는 익명 함수로 구현하기 때문에 인터페이스에 메소드가 여러개 있다면 어떤 메소드를 구현한 것인지 모호해진다.)
'JAVA > 람다,스트림' 카테고리의 다른 글
자바 람다식 기초 - 2 (0) | 2021.02.27 |
---|