**람다 표현식(Lambda Expression)**은 자바 8에서 도입된 간결한 문법으로, **익명 함수(anonymous function)**와 같은 역할을 합니다. 람다 표현식을 사용하면 코드를 간결하게 작성할 수 있으며, 특히 함수형 프로그래밍 스타일을 자바에서 사용할 수 있도록 지원합니다.
람다 표현식은 **함수형 인터페이스(Functional Interface)**와 함께 자주 사용되며, **단일 추상 메서드(Single Abstract Method, SAM)**를 구현하는 용도로 사용됩니다. 이를 통해 자바에서 간결한 콜백 처리와 데이터 처리를 할 수 있습니다.
1. 람다 표현식의 문법
람다 표현식의 기본적인 문법은 다음과 같습니다:
(매개변수) -> { 실행 코드 }
• 매개변수: 람다 표현식으로 전달되는 인수(메서드의 인수와 유사).
• ->: 람다 표현식에서 매개변수와 메서드 본문을 구분하는 화살표.
• 실행 코드: 매개변수를 이용해 실행할 로직.
예시: 기본 문법
// 기존의 익명 클래스로 Runnable 구현
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Running");
}
};
// 람다 표현식으로 대체
Runnable runnableLambda = () -> System.out.println("Running");
• 익명 클래스를 사용한 코드를 람다 표현식으로 간결하게 변환할 수 있습니다.
• 람다 표현식은 코드가 짧고 명확하여 콜백 함수나 일회성 함수를 정의할 때 유용합니다.
2. 람다 표현식의 구성 요소
람다 표현식은 다음과 같은 3가지 주요 구성 요소로 이루어집니다.
1. 매개변수 리스트:
• 메서드 인수와 동일하게 작동합니다. 인수의 타입은 명시적으로 지정할 수 있지만, 컴파일러가 타입을 추론할 수 있기 때문에 생략할 수 있습니다.
• 매개변수가 하나인 경우, **괄호(())**를 생략할 수 있습니다.
(int x, int y) -> x + y // 명시적인 타입 지정
(x, y) -> x + y // 타입 생략 (컴파일러가 추론)
x -> x * 2 // 매개변수가 하나일 때 괄호 생략
2. 화살표(->):
• 람다 표현식에서 매개변수와 메서드 본문을 구분하는 역할을 합니다.
3. 메서드 본문:
• 람다 표현식이 실행할 코드 블록입니다. **중괄호 {}**를 사용할 수 있으며, 코드 블록이 한 줄인 경우 중괄호와 return 키워드를 생략할 수 있습니다.
(x, y) -> { return x + y; } // 중괄호 사용
(x, y) -> x + y // 중괄호와 return 생략
3. 함수형 인터페이스(Functional Interface)
람다 표현식은 함수형 인터페이스와 함께 사용됩니다. 함수형 인터페이스는 단 하나의 추상 메서드만 가진 인터페이스로, 람다 표현식을 통해 해당 메서드를 구현할 수 있습니다.
자바에서는 @FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있습니다. 함수형 인터페이스는 단일 메서드만 가지며, 이를 구현하는 데 람다 표현식을 사용할 수 있습니다.
예시: 함수형 인터페이스
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
// 람다 표현식으로 함수형 인터페이스 구현
Calculator addition = (a, b) -> a + b;
Calculator subtraction = (a, b) -> a - b;
public class Main {
public static void main(String[] args) {
System.out.println(addition.calculate(10, 5)); // 출력: 15
System.out.println(subtraction.calculate(10, 5)); // 출력: 5
}
}
• Calculator 인터페이스는 하나의 추상 메서드만 가지고 있기 때문에, 이를 람다 표현식으로 간단히 구현할 수 있습니다.
• 함수형 인터페이스와 람다 표현식의 조합을 통해, 코드를 더 간결하게 작성할 수 있습니다.
4. 자바에서의 람다 표현식 활용 사례
람다 표현식은 자바에서 다양한 상황에서 활용됩니다. 특히, 스트림 API와 함께 사용되는 경우가 많으며, 콜백 함수나 이벤트 처리에서도 자주 쓰입니다.
4.1 스트림 API와 람다 표현식
자바 8부터 도입된 스트림 API는 데이터를 필터링, 변환, 집계할 때 유용합니다. 스트림 API는 람다 표현식과 함께 사용되어 데이터 처리 코드를 간결하게 작성할 수 있습니다.
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 람다 표현식을 사용한 스트림 API 처리
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(n -> System.out.println(n)); // 출력: 2, 4
}
}
• 람다 표현식을 사용하여 짝수만 필터링한 뒤, 각 요소를 출력하는 코드입니다.
• 스트림 API와 람다 표현식을 사용하면 데이터 처리 파이프라인을 간단하게 표현할 수 있습니다.
4.2 이벤트 처리 및 콜백 함수
람다 표현식은 이벤트 처리나 콜백 함수를 구현할 때도 유용합니다. 기존의 익명 클래스를 사용하는 방식보다 더 간결하게 표현할 수 있습니다.
// 기존의 익명 클래스로 버튼 클릭 이벤트 처리
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick() {
System.out.println("Button clicked");
}
});
// 람다 표현식을 사용한 이벤트 처리
button.setOnClickListener(() -> System.out.println("Button clicked"));
• 람다 표현식을 사용하면 코드가 짧아지고, 가독성이 높아집니다.
5. 람다 표현식의 장점
1. 코드 간결성:
• 익명 클래스를 사용할 때보다 코드가 훨씬 간결해지며, 불필요한 코드가 줄어듭니다.
2. 가독성:
• 코드의 가독성이 높아지며, 특히 함수형 프로그래밍을 적용할 때 유리합니다.
3. 함수형 프로그래밍 지원:
• 람다 표현식을 사용하여 데이터 처리를 함수형 스타일로 할 수 있습니다. 이는 코드의 유연성과 확장성을 높여줍니다.
4. 콜백 함수나 이벤트 처리:
• 이벤트 처리나 콜백 메서드를 정의할 때 람다 표현식을 사용하면, 일회성 함수를 간단하게 정의할 수 있습니다.
6. 람다 표현식의 한계
람다 표현식이 자바에서 매우 유용한 도구이긴 하지만, 몇 가지 한계도 존재합니다.
1. 디버깅 어려움:
• 람다 표현식은 코드가 간결한 대신, 디버깅 시 에러가 발생한 지점을 파악하기 어려운 경우가 있습니다.
2. 복잡한 논리에는 부적합:
• 람다 표현식은 주로 간단한 로직을 구현하는 데 적합하며, 복잡한 논리가 필요할 때는 익명 클래스나 명시적인 클래스가 더 나을 수 있습니다.
7. 결론
람다 표현식은 자바 8에서 도입된 중요한 기능으로, 익명 클래스를 간결하게 대체하고 함수형 프로그래밍을 지원합니다. 이를 통해 코드가 간결해지고, 가독성이 높아집니다. 특히 함수형 인터페이스와 함께 사용될 때, 데이터 처리나 콜백 메서드 구현에서 매우 유용하게 활용됩니다.
람다 표현식을 이해하고 잘 활용하면, 자바 코드에서 반복적인 패턴을 줄이고, 데이터 중심의 함수형 프로그래밍 스타일을 쉽게 구현할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] Optional (2) | 2024.09.29 |
---|---|
[Java] 리스트(List) 와 배열(Array)의 차이점 (0) | 2024.09.29 |
[Java] Enum (1) | 2024.09.28 |
[Java] 상속 vs 합성 (0) | 2024.09.28 |
[Java] final (0) | 2024.09.28 |