여섯번 째, 람다란?
개요: 필자가 람다와 스트림을 공부하면서 정리하기 위해 쓴 게시물이다. 참고로 구글링을 많이 참고했다.
람다식
정의 및 특징
- 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행한다.
- 함수를 하나식으로 표현한 것이다.
- 메소드의 이름이 필요 없기 때문에 익명함수의 한종류라고 볼 수 있다.
- 메소드 이름은 왜 없을까? : 함수형 인터페이스의 인스턴스를 생성하여 함수를 변수처럼 선언하기 때문이다.
- 람다식 내에서 사용되는 지역변수는 final 붙지 않아도 상수로 간주 된다.
- 람다식으로 선언된 변수명은 다른 변수명과 중복되지 않는다.
EX) (매개변수) -> {실행문}
(x, y) -> (x >= y) ? x : y;
사용이유
- 불필요한 코드를 줄여주기 위함이다.
- 가독성을 높이기 위함이다.
장점
- 코드를 간결하게 만들 수 있다.
- 개발자의 의도가 명확해 가독성이 높아진다.
- 함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다.
- 다중cpu를 활용하는 형태로 구현되어 병렬 프로그래밍에 유리하다.
단점
- 디버깅이 어렵다.
- 람다를 통해 만들어진 무명함수는 재사용이 불가능하다.
- 비슷한 함수가 중복 생성되어 코드가 지저분해질 수 있다.
- 재귀로 만들경우에 부적합하다.
함수형인터페이스
- 람다식을 선언하기 위한 인터페이스이다.
- 익명함수와 매개 변수만으로 구현되므로 단 하나의 메서드만을 가져야 한다.
- @Functionallnterface -> 함수형 인터페이스라는 의미이다.
다음은 예시문이다.
package lambda;
@FunctionalInterface
public interface MyNumber {
int getMaxNumber(int num1, int num2);
}
package lambda;
public class TestMyNumber {
public static void main(String[] args) {
MyNumber maxNum = (x, y) -> ((x >= y) ? x : y);
System.out.println(maxNum.getMaxNumber(10, 5));
}
}
느낀점: 람다라는 개념을 배웠는데 역시 어렵다.... 그치만 언젠가는 익숙해질거다. 이 친구는 뭔가 많이 쓸거 같다. 그러니 잘 이해해 보도록 하자.
void 인터페이스는 한쪽으로 sout 해주고 반환값있는 인터페이스는 나중에 sout 해주자