# 람다식이란?
Java에서 람다식은 익명 함수를 간단하고 직관적으로 표현하기 위한 문법이다.
특히 추상 메서드가 하나만 존재하는 인터페이스(함수형 인터페이스)를 구현할 때 자주 사용되며 불필요한 클래스 선언 없이 간편하게 동작을 전달할 수 있다.
# 람다식 기본 문법
(parameter) -> expression
() : 매개변수 선언
-> : 함수의 동작을 표현
expression 또는 {... } : 실행할 코드
(parameter) -> { expression }
여러 줄의 코드가 필요한 경우 중괄호 { }를 사용한다.
# 람다식 문법 예시
1) 매개변수가 없는 경우
() -> System.out.println("A");
2) 매개변수가 하나인 경우
x -> x * x;
3) 매개변수가 여러 개인 경우
(a, b) -> a + b;
4) 여러 줄의 코드가 있을 경우
(a, b) -> { int sum = a + b; return sum; }
# 람다식 활용 예시(사용자 정의 함수형 인터페이스)
아래 코드는 IAdd라는 함수형 인터페이스를 람다식으로 구현하여 사용한 예시다.
@FunctionalInterface
public interface IAdd {
int add(int x, int y);
}
class UI {
public static void main(String[] args) {
IAdd iAddFunc = (x, y) -> {
int j = 10;
return (x + y + j);
};
new UiUse().AddSomething(iAddFunc, 3, 4);
}
}
class UiUse {
public void AddSomething(IAdd iAdd, int x, int y) {
System.out.println(iAdd.add(x, y));
}
}
람다식을 사용하면 인터페이스를 구현하기 위한 별도의 클래스를 만들 필요가 없다.
필요한 동작만 람다로 전달해 간결하게 흐름을 구성할 수 있다.
# Java에서 제공하는 대표적인 함수형 인터페이스
Java는 자주 사용되는 함수 형태를 위해 미리 만들어둔 함수형 인터페이스를 제공한다.
Predicate <T>
조건을 검사하여 boolean 값을 반환한다.
Predicate<String> isEmpty = (str) -> str.isEmpty();
System.out.println(isEmpty.test(""));
Consumer <T>
값을 받아서 사용하지만 반환값은 없다.
Consumer<String> printMsg = msg -> System.out.println(msg);
printMsg.accept("Hello");
Supplier <T>
입력값 없이 값을 제공(return) 한다.
Supplier<Double> randomVal = () -> Math.random();
System.out.println(randomVal.get());
Function <T, R>
값을 받아서 다른 타입으로 변환하는 데 사용된다.
Function<Integer, String> convertFn = (num) -> "Number " + num;
System.out.println(convertFn.apply(10));
# 실무 예시: DB 문자열 데이터를 객체로 매핑하기
데이터베이스에서 cha, 25 같은 문자열을 가져온 뒤
이를 Person 객체로 변환하고 싶을 때 Function을 활용할 수 있다.
Person 객체
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Function을 이용한 변환 로직
class FunctionEx {
public static void main(String[] args) {
String dbResult = "cha, 25";
Function<String, Person> mapToUser = str -> {
var parts = str.split(",");
var name = parts[0];
var age = Integer.parseInt(parts[1]);
return new Person(name, age);
};
System.out.println(new UseFunc().convertFunc(mapToUser, dbResult));
}
}
Generic 메서드로 재사용성 강화
class UseFunc {
public <T, R> R convertFunc(Function<T, R> func, T param) {
return func.apply(param);
}
}
| 항목 | 내용 |
| 목적 | 익명 함수 표현 단축, 함수형 프로그래밍 지원 |
| 특징 | 함수형 인터페이스와 함께 사용 |
| 문법 | (parameter) -> { body } |
| 장점 | 코드 간결성, 가독성 향상, 불필요한 클래스 제거 |
| 대표 인터페이스 | Predicate, Consumer, Supplier, Function |
| 실무 활용 | 데이터 처리, 스트림(Stream) API, 콜백 함수, 이벤트 처리 |
'java' 카테고리의 다른 글
| Thread (0) | 2025.11.28 |
|---|---|
| Stream (0) | 2025.11.28 |
| Generic Type(=제네릭 타입) (0) | 2025.11.28 |
| Abstract class(=추상화) (0) | 2025.11.28 |
| Encapsulation(=캡슐화) (0) | 2025.11.28 |
