람다식이란?
람다식이란 쉽게 말해 메서드를 하나의 식으로 표현한 것입니다.
하나의 식으로 표현하여 훨씬 간략하게 표현이 가능하게 되며, 메서드의 이름과 반환값이 없어지므로 익명함수라고도 합니다.
람다식은 오직 람다식 자체만으로도 메서드이 역할을 대신할 수 있으며, 메서드의 매개변수로 전달되어지는 것도 가능하고, 메서드이 결과로 반환될 수도 있습니다.
즉, 람다식으로 메서드를 변수처럼 다루는 것이 가능한 것 입니다.
람다식 작성 방법
예를 들어서 두 값 중 큰 값을 반환하는 메서드 max를 람다식으로 변환한다면, 아래와 같습니다.

주의점
지금처럼 선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략 할수 있지만
a -> System.out.pritnln(a); (o)
매개변수의 타입을 생략하지 않은 경우는 괄호()를 생략할 수 없다.
int a -> System.out.pritnln(a); (x)
만약 매개 변수가 없다면 람다식에서 매개 변수가 자리가 없어지므로 다음과 같이 빈 괄호()를 반드시 사용해야 한다. ( ) -> { 실행문; }
괄호 {} 안의 문장이 하나일 때만 괄호{}를 생략할 수 있고 문장의 끝에 ; (세미콜론)을 붙이지 않아야 한다.
이 익명 객체를 다룰 수 있는 인터페이스가 필요한데 Object 타입으로 하기에는 람다 기능을 Object 클래스에 넣어야하는 부담이 생긴다. 그래서 람다식을 저장할 수 있는 참조변수는 '함수형 인터페이스(Functional Interface)' 타입이어야 한다.
🤔 함수형 인터페이스(Functional Interface) 란 무엇인가?
이것은 하나의 추상 메서드만을 갖는 인터페이스(Interface)이다.
그래야지 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다!!
이 추상 메서드의 매개변수의 개수와 타입, 리턴타입과 동일한 람다식을 할당해서 사용할 수 있다.
(함수형 인터페이스의 Static 메서드와 Default 메서드의 개수에는 제약이 없다)
람다식 구현
// MyFunction 인터페이스가 있을때,
interface MyFunction {
public abstract int max(int a, int b);
}
// 이 인터페이스를 구현한 익명 클래스의 객체는 다음과 같이 생성할 수 있다.
MyFunction f = new MyFunction() {
public int max(int a, int b){
return a > b ? a : b;
}
};
// 익명 객체를 람다식으로 대체
// MyFunction f = (int a, int b) ->a > b ? a : b;
// 익명 객체의 메서드를 호출
int big = f.max(5, 3);
@FunctionalInterface
interface MyFunction{
void run(); // public abstract void run();
}
class LambdaEx1 {
static void execute(MyFunction f) { // 매개변수의 타입이 MyFunction인 메서드
f.run();
}
static MyFunction getMyFunction() { // 반환 타입이 MyFunction인 메서드
MyFunction f = () -> System.out.println("f3.run()");
return f;
}
public static void main(String[] args){
// 람다식으로 MyFunction의 run()을 구현
MyFunction f1 = ()-> System.out.println("f1.run()");
MyFunction f2 = new MyFunction() { // 익명클래스로 run()을 구현
public void run() { // public을 반드시 붙여야 함
System.out.println("f2.run()");
}
};
MyFunction f3 = getMyFunction();
f1.run();
f2.run();
f3.run();
execute(f1);
execute( ()-> System.out.println("run()") );
}
}
// kotlin
class Person(
val name: String,
val age: Int
)
val billGates = Person("Bill Gates", 12)
val markZuckerberg = Person("Mark Zuckerberg", 15)
val elonMusk = Person("Elon Musk", 4)
val maxAge = listOf(billGates, markZuckerberg, elonMusk).maxOf { person -> person.age }
println(maxAge) -- 15
[Java] 람다식이란?
[Java/자바] 람다식(Lambda)이란? 그리고 사용법
Kotlin 람다 파헤치기