
1. 람다식(Lambda Expression)란?
람다식은 익명 함수(Anonymous Function) 를 생성하기 위한 식으로, 자바 8부터 도입되었습니다. 람다식을 사용하면 코드가 간결해지고 가독성이 좋아지며, 컬렉션 및 스트림 API와 함께 활용할 때 더욱 유용합니다.
기존의 익명 클래스를 사용하는 방식보다 코드가 훨씬 간결해지며, 함수형 인터페이스(Functional Interface)와 함께 사용됩니다.
2. 람다식 기본 문법
(매개변수) -> { 실행 코드 }
람다식에서 매개변수 타입은 생략 가능하며, 코드 블록이 한 줄이라면 중괄호 {} 생략이 가능합니다.
람다식 기본 사용법
// 기존 익명 클래스 방식
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, Lambda!");
}
};
// 람다식 사용
Runnable r2 = () -> System.out.println("Hello, Lambda!");
r1.run();
r2.run();
3. 함수형 인터페이스와 람다식
람다식은 함수형 인터페이스(Functional Interface) 와 함께 사용됩니다. 함수형 인터페이스는 하나의 추상 메서드만 가지는 인터페이스를 의미하며, @FunctionalInterface 어노테이션을 사용할 수 있습니다.
함수형 인터페이스와 람다식
@FunctionalInterface
interface MyFunction {
int calculate(int a, int b);
}
public class LambdaExample {
public static void main(String[] args) {
// 람다식 사용
MyFunction add = (a, b) -> a + b;
MyFunction multiply = (a, b) -> a * b;
System.out.println("덧셈: " + add.calculate(5, 3)); // 8
System.out.println("곱셈: " + multiply.calculate(5, 3)); // 15
}
}
4. 자바에서 제공하는 함수형 인터페이스
자바 8부터는 java.util.function 패키지에서 기본적인 함수형 인터페이스를 제공하며, 이를 활용하면 별도의 인터페이스를 만들 필요 없이 간단하게 람다식을 사용할 수 있습니다.
함수형 인터페이스 | 메서드 시그니처 | 설명 |
Supplier<T> | T get() | 매개변수 없이 결과 반환 |
Consumer<T> | void accept(T t) | 매개변수를 받아 사용하지만 반환값 없음 |
Function<T, R> | R apply(T t) | 매개변수를 받아서 변환 후 반환 |
Predicate<T> | boolean test(T t) | 조건을 검사하여 true/false 반환 |
BiFunction<T, U, R> | R apply(T t, U u) | 두 개의 입력을 받아 하나의 결과 반환 |
Function과 Predicate 사용하기
import java.util.function.Function;
import java.util.function.Predicate;
public class LambdaExample2 {
public static void main(String[] args) {
// Function: 입력 값을 받아 변환 후 반환
Function<String, Integer> stringLength = str -> str.length();
System.out.println("길이: " + stringLength.apply("Lambda")); // 6
// Predicate: 조건 검사 후 boolean 반환
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println("짝수인가? " + isEven.test(10)); // true
}
}
5. 컬렉션과 스트림 API에서 람다식 활용
람다식은 자바의 컬렉션과 스트림 API에서 강력한 기능을 발휘합니다.
List에서 forEach와 filter 사용하기
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class LambdaExample3 {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// forEach 사용
names.forEach(name -> System.out.println(name));
// filter와 collect 사용
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println("A로 시작하는 이름: " + filteredNames);
}
}
6. 메서드 참조(Method Reference)
람다식은 메서드 참조 방식으로 더욱 간결하게 표현할 수도 있습니다.
메서드 참조 사용하기
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 기존 람다식
names.forEach(name -> System.out.println(name));
// 메서드 참조 사용
names.forEach(System.out::println);
}
}

자바의 람다식은 코드의 가독성을 높이고 간결하게 작성할 수 있도록 도와줍니다. 특히 함수형 인터페이스와 함께 사용하면 코드의 유지보수성이 향상됩니다. 또한 스트림 API와 결합하면 컬렉션을 더욱 효과적으로 다룰 수 있습니다.
람다식 활용 시 유의할 점:
- 하나의 추상 메서드만 있는 함수형 인터페이스에서만 사용 가능
- 코드가 지나치게 복잡해지지 않도록 주의 (간결함을 유지하는 것이 중요)
- 메서드 참조를 활용하면 더욱 가독성이 좋아질 수 있음

'Back_End > JAVA' 카테고리의 다른 글
자바(Java) 스트림(Stream) 이란? (1) | 2025.02.13 |
---|---|
싱글톤 패턴 (Singleton Pattern) (0) | 2025.02.13 |
POJO(Plain Old Java Object) 란? (1) | 2025.02.05 |
자바(Java)에서 스레드를 구현하는 방법 (1) | 2025.02.03 |
RuntimeException과 Exception의 차이점 (1) | 2025.01.15 |