본문 바로가기

Java

Java8 람다(Lambda) 제대로 쓰기

람다 왜 알아야되나?

Java8 이상 버전을 사용하더라도 람다를 몰라도 된다. 하지만 이는 좋은 장비를 사놓고 좋은 기능을 쓰지 않는 것과 비슷하다.

 

아래의 예제를 먼저 살펴보자.

 

특정 조건을 만족하는 주문을 보여주는 프로그램이다.

 

처음에는 특정 가격보다 비싼 주문을 보여달라고 했다.

 

하지만 고객이 이름으로도 조회를 해달라고 한다면?

 

계속 해당 코드에 메소드를 추가하고 수정해야 한다.

 

동적 파라미터화

말그대로 파라미터로 어떤 행위를 전달하는 것이다. 

 

위의 예제에 적용해보면 특정 조건을 만족하는지에 대해 체크 해주는 행위를 파라미터로 넘기는 것이다.

 

( 마치 전략 디자인 패턴과 같다. )

 

아까 작성한 함수를 조금 리팩토링 해보자.

 

파라미터로 특정 조건을 체크해주는 행위를 받았다.

그럼 아래와 같이 collect2Order() 함수는 수정을 하지 않아도 되고,

 

외부에서 조건을 체크해주는 행위를 파라미터로 넘겨주기만 하면 된다.

 

하지만, 이정도면 그냥 if문만 수정하는게 더 빠를거라는 생각이 든다.

 

왜냐하면, 조건은 n개로 늘어날텐데 매번 클래스를 생성할 수 없지 않는가....

익명 클래스( anonymous class )

별도의 클래스를 생성하지 않고 아래와 같이 코드를 작성할 수도 있지만,

 

코드가 장황해지고 가독성이 떨어진다.

 

이러한 문제를 해결하기 위해 드디어 람다 표현식이 등장한 것이다.

람다 ( lambda )

아래의 코드와 같이 가독성이 상당히 좋아졌다.

람다를 사용할 경우에는 반드시 함수형 인터페이스를 통해서 사용할 수 있다.

 

즉, 하나의 메소드만 지닌 인터페이스만 지원한다는 것이다.

그런데 다른 개발자가 이 인터페이스가 람다로 쓰이는 줄 모르고 함수를 추가한다면?

 

그럼 컴파일 에러가 나게 된다.

 

그래서 함수형 인터페이스를 알려주기 위해 다음과 같은 어노테이션을 사용한다.