본문 바로가기
프로그래밍언어/Java

[자바의 정석] 14. 람다식

by qkzkdo 2023. 12. 30.
728x90

1. 람다식이란?

람다식(Lambda expression)은 메서드를 하나의 '식(expression)'으로 표현한 것이다. 람다식은 함수를 간단하면서도 명확한 식으로 표현할 수 있게 해준다.

람다식을 '익명 함수(anonymous function)'이라고도 한다.

 

모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야 하고, 객체도 생성해야만 비로소 메서드를 호출할 수 있다. 그러나 람다식은 이 모든 과정 없이 오직 람다식 자체만으로도 메서드의 역할을 대신할 수 있다.

 람다식은 메서드의 매개변수로 전달되어지는 것이 가능하고, 메서드의 결과로 반환될 수도 있다. 람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해졌다.

 

*메서드는 함수와 같은 의미지만, 특정 클래스에 반드시 속해야 한다는 제약이 있기 때문에 메서드라는 용어를 사용한 것

 

 

2. 람다식 작성하기

람다식은 '익명 함수'답게 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통{ } 사이에 '->'를 추가한다.

반환타입 메서드이름 (매개변수 선언) {
    문장들
}



반환타입 메서드이름 (매개변수 선언)  -> {
    문장들
}

 

 

예를 들어 두 값 중에서 가장 큰 값을 반환하는 메서드 max를 람다식으로 변환하면, 아래와 같이 된다.

int max (int a, int b) {
    return a > b ? a : b;
}

↓

(int a, int b) -> {return a > b ? a : b;}

 

반환값이 있는 메서드의 경우, return문 대신 '식(expression)'으로 대신 할 수 있다. 식의 연산결과가 자동적으로 반환값이 된다. 이때는 '문장(statement)'이 아닌 '식'이므로 끝에 ';'를 붙이지 않는다.

(int a, int b) -> { return a > b ? a : b; }

↓

(int a, int b) -> a > b ? a : b

 

람다식에 선언된 매개변수의 타입은 추론이 가능한 경우는 생략할 수 있는데, 대부분의 경우에 생략이 가능하다.

(int a, int b) -> a > b ? a : b

↓

(a, b) -> a > b ? a : b

 

선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략할 수 있다. 단, 매개변수의 타입이 있으면 괄호()를 생략할 수 없다.

(a) -> a * a
(int a) -> a * b

↓

a -> a * a //OK
int a -> a * a //에러

 

괄호 { } 안의 문장이 하나일 때는 괄호 { }를 생략할 수 있다. 이 때 문자으이 끝에 ';'를 붙이지 않아야 한다는 것에 주의하자.

 

(String name, int i) -> {
    System.out.println(name+"="+i);
}

↓

(String name, int i) -> 
    System.out.println(name+"="+i)

 

괄호 { } 안의 문장이 return문일 경우 괄호 { }를 생략할 수 없다.

 

 

출처 : 남궁성. 「자바의 정석」. 도우출판. 2016

728x90