# 개요
람다 표현식은 Java 8에서 처음 도입되어, 간결하고 명확한 코드를 작성할 수 있게 해 주는 매우 중요한 도구입니다. 특히 컬렉션의 처리, 멀티스레딩 등 다양한 상황에서 람다 표현식은 우리에게 많은 도움을 줍니다.
## 람다 표현식의 기본 개념
람다 표현식은 간단히 말해 메소드를 하나의 식으로 표현한 것을 말합니다. 기본 형태는 `(parameters) -> { body }`와 같습니다.
여기서 `parameters`는 람다 표현식의 입력 파라미터들이고, `body`는 해당 파라미터들을 이용하여 수행할 연산이나 로직을 포함합니다.
람다 표현식의 가장 큰 장점은 코드의 간결성입니다. 복잡한 로직을 단 몇 줄의 코드로 표현할 수 있게 해주죠.
## 람다 표현식의 사용법
람다 표현식의 사용법은 매우 간단합니다. 예를 들어, 정수 리스트의 각 요소를 출력하는 코드를 봅시다.
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(number -> System.out.println(number));
```
여기서 `number -> System.out.println(number)` 부분이 바로 람다 표현식입니다.
## 람다 표현식 사용 예시
위에서 언급한 코드를 람다 표현식을 사용하지 않는 방식으로 작성하면 아래와 같습니다.
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
for(Integer number : numbers) {
System.out.println(number);
}
```
비교해보면, 람다 표현식을 사용한 코드가 훨씬 간결하며 가독성이 좋음을 알 수 있습니다.
이번에는 각 요소를 제곱하는 연산을 적용해보겠습니다.
1) **람다 표현식 없이 작성한 코드**
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squaredNumbers = new ArrayList<>();
for(Integer number : numbers) {
squaredNumbers.add(number * number);
}
System.out.println(squaredNumbers); // 출력 결과: [1, 4, 9, 16, 25]
```
2) **람다 표현식을 사용한 코드**
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squaredNumbers = numbers.stream()
.map(number -> number * number)
.collect(Collectors.toList());
System.out.println(squaredNumbers); // 출력 결과: [1, 4, 9, 16, 25]
```
람다 표현식을 사용한 이 코드는 첫 번째 코드보다 훨씬 간결하고 가독성이 좋습니다. `stream()` 메소드를 통해 리스트를 스트림으로 변환한 뒤, `map()` 함수를 이용해 각 요소에 대한 제곱 연산을 적용하고, `collect()` 함수를 이용해 다시 리스트로 변환하고 있습니다. 이 과정에서 `number -> number * number`라는 람다 표현식을 사용하여 각 요소에 대한 제곱 연산을 정의하였습니다.
위의 두 코드는 동일한 기능을 수행하지만, 람다 표현식을 사용한 코드는 간결하고 가독성이 뛰어나며, 함수형 프로그래밍의 장점을 잘 보여줍니다.
# **주의사항**
람다 표현식을 사용할 때 주의해야 할 몇 가지 사항들이 있습니다:
1) **상태 변경 주의**: 람다 표현식은 함수형 프로그래밍의 원칙에 따라 사이드 이펙트(side effect)가 없어야 합니다. 즉, 람다 표현식 내부에서 외부 변수의 상태를 변경하거나, 외부 환경에 영향을 미치는 동작을 수행하는 것은 피해야 합니다.
2) **병렬 처리 시 주의**: 람다 표현식은 자바의 병렬 스트림과 함께 사용되는 경우가 많습니다. 이 때, 람다 표현식이 상태를 가지거나, 멀티스레딩 환경에서 안전하지 않은 연산을 수행하는 경우 문제가 발생할 수 있습니다.
3) **가독성 유지**: 람다 표현식은 코드를 간결하게 만들어주지만, 과도한 사용은 오히려 코드의 가독성을 저하시킬 수 있습니다. 특히, 람다 표현식이 복잡해지거나, 깊이가 깊어지는 경우에는 가독성을 위해 메소드 참조(method reference)를 사용하거나, 람다 표현식을 별도의 메소드로 분리하는 것이 좋습니다.
4) **디버깅 어려움**: 람다 표현식은 익명 함수로서, 일반 메소드에 비해 디버깅이 어려울 수 있습니다. 이 점을 고려해 코드를 작성하고, 필요한 경우 적절한 로깅을 추가하는 것이 좋습니다.
6. 자체 질문
1) **질문1: 람다 표현식이란 무엇인가요?**
답변: 람다 표현식은 익명 함수로, 메소드를 하나의 식으로 표현한 것을 말합니다. 람다 표현식은 코드의 간결성을 높이며, 함수형 프로그래밍 스타일을 가능하게 합니다.
2) **질문2: 람다 표현식의 장점은 무엇인가요?**
답변: 람다 표현식의 주요 장점은 코드의 간결성과 가독성입니다. 람다 표현식은 익명 함수를 통해 코드를 간결하게 만들어줍니다. 또한, 람다 표현식은 함수형 프로그래밍을 가능하게 하여 순수 함수와 불변성 등의 개념을 적용할 수 있도록 합니다.
3) **질문3: 람다 표현식을 사용할 때 주의해야 할 점은 무엇인가요?**
답변: 람다 표현식을 사용할 때 주의해야 할 점은 사이드 이펙트를 피하는 것입니다. 람다 표현식은 함수형 프로그래밍의 원칙에 따라 사이드 이펙트가 없어야 합니다. 또한, 람다 표현식은 코드의 간결성을 높이지만, 과도한 사용은 가독성을 저하시킬 수 있으므로 적절한 사용이 필요합니다.
4) **질문4: 람다 표현식과 스트림 API의 관계는 무엇인가요?**
답변: 람다 표현식은 자바의 스트림 API와 함께 사용되는 경우가 많습니다. 스트림 API는 데이터를 병렬로 처리하는 것을 지원하며, 이 때 람다 표현식을 사용하여 간단하게 병렬 코드를 작성할 수 있습니다.
5) **질문5: 람다 표현식이 코드의 성능에 어떤 영향을 미치나요?**
답변: 람다 표현식 자체가 코드의 성능을 향상시키는 것은 아닙니다. 그러나 람다 표현식은 스트림 API와 함께 사용될 때 성능상의 이점을 가져올 수 있습니다. 스트림 API는 데이터를 병렬로 처리하므로, 멀티코어 프로세서를 활용하여 성능을 향상시킬 수 있습니다. 하지만, 병렬 처리는 항상 성능 향상을 보장하는 것은 아닙니다. 이를 위해서는 충분한 성능 테스트와 튜닝이 필요합니다.