람다 표현식
익명의 함수를 만드는 기능으로 C++11에서 도입되었다. 코드 내에서 간결하게 함수를 정의하고 사용할 수 있도록 도와준다. 특히 std::function
이나 STL의 다양한 알고리즘 함수에 인라인으로 사용할 때 유용하다. 람다 표현식 혹은 람다식이라 한다.
기본 문법은 아래와 같다.
[capture](parameter) -> return_type { body };
캡처 리스트에는 람다식에 사용하고자 하는 함수 바깥 변수 목록이고, 매개변수 리스트, 리턴타입, 함수 바디는 기본적인 함수와 동일하게 사용하면 된다. 이때 -> return_type
은 생략 가능하다.람다식을 사용할 때 역시 일반적인 함수와 마찬가지로 소괄호를 이용하여 매개변수를 전달해주면 된다.
캡처 리스트는 [=]
을 통해 모든 외부 변수를 복사하여 캡처할 수도 있고, [&]
을 통해 모든 외부 변수를 참조로 캡처할 수도 있다. 당연히 특정 변수나 특정 변수를 참조하여 캡처할 수도 있다.
예를 들어 간단하게 두 int
형 변수의 합을 출력해주는 람다식을 아래와 같이 사용할 수 있다.
[](int a, int b) { std::cout << a + b << std::endl; } (2, 3);
앞서 말한 바와 같이 람다식 바깥 변수를 캡 리스트에서 사용하는 람다식도 사용할 수 있다. 다음은 반지름을 입력받아 원의 면적을 반환하는 람다식이다.
double pi = 3.14;
double area = [pi](int r) -> double{ return pi * r * r; } (3);
auto
auto
키워드를 사용하여 람다식을 저장하고 사용할 수 있다. 람다식 형식은 컴파일러만 알기 때문에 람다식을 저장하는 변수 타입을 개발자가 선언할 수 없고 auto
를 사용해야 한다. 이를 통해서 함수를 지역변수처럼 다룰 수 있다.
예를 들어 간단히 문자열을 출력하는 함수를 람다식으로 구현하고 이를 변수로 저장하여 사용할 수 있다.
auto print = [](std::string a) { std::cout << a << std::endl; };
STL
STL의 알고리즘 함수와 함께 사용할 때도 굉장히 유용하다.
예를 들어 각 벡터의 원소를 출력하고 싶다면 다음과 같은 코드의 람다식을 이용할 수 있을 것이다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
for_each(v.begin(), v.end(), [](int n) { cout << n << ' '; });
return 0;
}
'Language > C & C++' 카테고리의 다른 글
[C++] 포맷 플래그(format flag) 및 조작자(manipulator) (0) | 2024.12.04 |
---|---|
[C++] 입출력 스트림(I/O stream) 및 버퍼(buffer) (0) | 2024.12.04 |
[C++] auto 키워드 (0) | 2024.11.14 |
[C++] 표준 템플릿 라이브러리(STL) (0) | 2024.11.14 |
[C++] 템플릿(template)을 통한 일반화(generic) (0) | 2024.11.13 |