프로그래밍/자바(Java)
[ 자바 / JAVA ] 함수형 프로그래밍과 람다식(Lambda Expression)
후르트링
2021. 7. 26. 19:29
728x90
자바에서는 기능을 수행하기 위해 객체를 생성하고, 객체 내부에 멤버 변수와 메소드를 선언하여 사용하는 객체 지향 프로그래밍 방식입니다.
그러나 Java SE 8 부터는 함수형 프로그래밍 방식을 지원하게 되었습니다.
자바에서 제공하는 함수형 프로그래밍 방식을 "람다식(Lambda Expression)"이라고 합니다.
자바에서는 익숙하지 않은 개념이므로 하나씩 알아보도록 하겠습니다.
[함수형 프로그래밍]
- 함수형 프로그래밍은 영어로 Functional Programming, 줄여서는 FP 라고 합니다.
- 함수형 프로그래밍은 순수 함수(매개변수만 사용하여 만드는 함수)를 사용하여 구현하고 호출하는 방식입니다.
- 이러한 방식은 함수 내부에서 외부 변수를 사용하지 않아서 side effect를 주지 않도록 구현하는 방식입니다.
[람다식]
- 람다식은 자바에서 함수형 프로그래밍을 사용하는 방식입니다.
- 람다식을 사용함으로써 코드의 길이를 줄일 수 있습니다.
- 람다식을 선언하기 위해서는 함수형 인터페이스가 필요합니다.
- 함수형 인터페이스
- @FunctionalInterface 애노테이션으로 선언합니다.(optional)
- 익명 함수와 매개 변수만으로 구현되므로 인터페이스는 단 하나의 메소드만을 선언해야 합니다.
- 함수형 인터페이스 안에 여러개의 메소드를 선언하면 오류가 생깁니다.
[람다식 문법]
간단하게 람다식 문법에 관하여 살펴보겠습니다.
- 파라미터가 1개인 람다식 문법
(p1) -> {
//람다식 함수 바디 구현
}
- 객체 지향에서의 일반적인 자바 함수 예시
int add(int x, int y){
return x+y;
}
- 람다식으로 표현
(int x, int y ) -> {return x+y;}
- 매개변수가 두 개이상인 경우 괄호를 생략할 수 없습니다.
x, y -> {System.out.println(x+y);} //오류
- 실행문이 한 문장인 경우 중괄호 생략 가능합니다.
str-> System.out.println(str);
- 실행문이 한 문장이라도 return문(반환문)은 중괄호를 생략할 수 없습니다.
str-> return str.length(); //오류
- 실행문이 한 문장의 반환문인 경우엔 return과 중괄호를 모두 생략가능합니다.
(x, y) -> x+y;
str -> str.length;
[객체 지향 vs 람다식]
- 객체 지향에서의 자바 코드
interface Drawable{
public void draw();
}
public class LambdaExpressionExample {
public static void main(String[] args) {
int width=10;
Drawable d1=new Drawable()
{
public void draw(){
System.out.println("Drawing "+width);
}
};
d1.draw();
}
}
- 람다식을 사용했을 때의 자바 코드
@FunctionalInterface
interface Drawable{
public void draw();
}
public class LambdaExpressionExample2 {
public static void main(String[] args) {
int width=10;
Drawable d2=()->{
System.out.println("Drawing "+width);
};
d2.draw();
}
}