최근에 함수형 프로그래밍을 많이 사용하게 되면서, Java 에서도 1.8 버전부터 함수형 방식의 람다(Lambda) 형식을 제공하고 있다.
또한, Java 프로그래밍 중 종종 사용하는 Stream 연산에서도 매개변수로 함수형 인터페이스를 받도록 되어있고, 람다식은 반환값으로 함수형 인터페이스를 반환한다.
이렇게 점점 Lambda 를 자주 접하게 되어 이를 한번 정리하고자 한다.
1. 람다(Lambda)식이란?
- 람다식(Lambda Expression)이란 함수를 하나의 식(Expression)으로 표현한 것.
- 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류.
(함수이지만 함수를 따로 만들지 않과, 코드한줄에 함수를 써서 그것을 호출하는 방식)
- Java(자바) 1.8 버전부터 제공.
1-1. 작성법
(매개변수 목록) -> { 함수 몸체 }
- Java 에서는 화살표( -> ) 기호를 사용하여 람다 표현식을 작성.
- Java 에서 람다 표현식을 작성할 때 유의사항
- 매개변수의 타입을 추론할 수 있는 경우에는 타입 생략 가능
- 매개변수가 하나인 경우에는 괄호() 생략 가능
- 함수의 몸체가 하나의 명령문만으로 이루어진 경우 중괄호{} 생략 가능
- 함수의 몸체가 하나의 return 문으로만 이루어진 경우 중괄호{} 생략 불가능
// 기존 함수 정의
public string hello(){
System.out.println("Hello");
}
// Lambda(람다) 함수 정의
() -> { System.out.println("Hello"); }
// 기존 방식
new Thread(new Runnable() {
public void run() {
System.out.println("기존 방식의 스레드 생성");
}
}).start();
// 람다 표현식
new Thread(()->{
System.out.println("람다를 사용한 스레드 생성");
}).start();
2. Lambda 의 특징
- 람다식은 이름을 가지지 않는다.(익명함수)
- 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주된다.
- 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다.
2-1. 장점
- 코드를 간결하게 만들수 있다.
- 코드에 개발자의 의도가 명확하게 드러나므로 가독성이 향상된다.
- 함수를 따로 만들지 않기 때문에 코딩하는 시간이 줄어든다.
- 병렬프로그래밍에 용이하다.
2-2. 단점
- 람다를 사용하여 만든 무명함수는 재사용이 불가능하다.
- 디버깅이 다소 어렵다.
- 람다를 막무가내로 사용시 오히려 가독성이 떨어질 수 있다.(비슷한 기능의 함수를 계속 중복 생설 할 수 있다.)
- 재귀형식으로 만들경우에는 다소 부적합하다.
3. 함수형 인터페이스(Functional Interface)
- 추상 클래스와는 달리 단 하나의 추상 메소드만을 갖도록 제한하는 인터페이스.
- @FunctionalInterface 어노테이션으로 사용.
- 위 어노테이션을 인터페이스에 선언하게 되면, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식.
- 자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 오류가 발생.
// 함수형 인터페이스의 선언
@FunctionalInterface
interface Calc {
public int min(int x, int y);
}
// 메소드가 2개이상 선언되어 에러가 발생된다.
@FunctionalInterface
interface Calc {
public int min(int x, int y);
public int max(int x, int y);
}
- Java 에서는 다양한 함수형 인터페이스 제공하고 있는데, 자세한 내용은 공식 Docs 를 참고.
참고
- https://mangkyu.tistory.com/113
'BackEnd > Java' 카테고리의 다른 글
[Java] Stream(스트림) 정리 (0) | 2022.08.13 |
---|---|
[Java] MDC 를 사용한 로그(Log)추적하기 (0) | 2022.07.30 |
[Java] Lombok 정리 (0) | 2022.07.06 |
[Java] String, StringBuffer, StringBuilder 차이 및 장단점 (0) | 2022.06.26 |
[Java] List 안에 있는 Map Value 찾기 (0) | 2022.01.15 |