Lamda Expression
Last updated
Last updated
람다는 이름 없는 함수라고 정의할 수 있다.
람다 이전에 std::sort 함수는 다음과 같이 함수를 정의해야만 했다. -> 다시 사용하지 않더라도 아래와 같은 형태로 사용하기 위해서는 함수를 정의해야만 했다. (유지보수 비용이 증가한다)
위와 같은 문제를 해결하기 위해서 이름 없는 함수를 만들어 낼 수 있는데, 이를 lamda expression 라 부른다.
이름 없는 함수 개체
내포(nested) 되는 함수
람다식을 품는 범위(scope) 안에 있는 변수를 람다식에 넘겨줄 때 사용
[]
비어 있음. 캡처하지 않음
=
값(shallow copy)에 의한 캡처, 모든 외부 변수를 캡처함
람다식 안에서 수정할 수 없음
&
참조(reference) 에 의한 캡처, 모든 외부 변수를 캡처함
<변수 이름>
특정 변수를 값으로 캡처
람다식 안에서 수정할 수 없음
&<변수 이름>
특정 변수를 참조로 캡처
예시1 : 캡처하지 않는 경우
예시2 : (에러!) 외부 변수 사용하기 -> 캡처를 사용하지 않아서 외부 변수에 대한 정보를 알 수 없다.
예시3 : 값에 의한 캡처 -> 값에 의한 캡처를 사용하므로 외부 모든 변수의 값을 사용할 수 있게 되었다. -> 값을 바꾸는 것은 불가하다.
예시4 : (에러!) 값에 의한 캡처
예시5 : 참조에 의한 캡처
예시6 : (에러) 값에 의한 특정 변수 캡처
예시7 : 참조에 의한 특정 변수 캡처
예시8 : 캡처 옵션 섞기
선택사항이다.
빈 괄호를 생략할 수 있다. -> 하지만 가독성 측면에서 명시적으로 생략하지 않는 것이 좋다.
예시1 : 두 값 더하기
예시2 : 정렬하기
선택사항이다.
mutable
값에 의해 캡처된 개체를 수정할 수 있게 한다.
예시1 : 값에 의해 캡처된 개체를 수정
선택사항이다.
반환형을 적지 않으면 반환문을 통해서 추론해준다.
예시1 : 반환형 명시
간단한 함수를 빠르게 작성할 수 있다.
디버깅하기 힘들어진다.. -> 함수의 이름이 정해져 있지 않기 때문에, call stack 에서 바로 확인이 어렵다..
함수 재사용성이 낮다.. -> 사람들은 보통 함수를 새로 만들기 전에 클래스에 있는 기존 함수를 찾아본다. -> 이 과정에서 람다 함수는 잘 띄지 않아서 못 찾을 가능성이 높다. -> 그럼 코드 중복이 발생한다.
기본적으로, 이름 있는 함수를 쓰자! (전통적 방식)
자잘한 함수는 람다로 써도 괜찮다. (한 줄짜리 함수) -> 하지만 재사용할 것 같다면 이름 있는 함수를 쓰자.
정렬 함수처럼 STL 컨테이너에 매개변수로 전달할 함수들은 람다를 사용하기 좋은 후보들이다.