프로그래밍 공부
작성일
2023. 5. 5. 07:10
작성자
WDmil
728x90

C++11 부터 람다식 함수 사용방법을 지원한다.

 

이는, 익명 함수를 생성하는 방법 중 하나로, 람다식 함수는 이름이 없는 함수 객체를 생서아형, 함수처럼 호출 할 수 있다.

 

람다식 함수는 함수 내부에서 선언되며, 접속할 수 있는 이름이 존재하지 않고 함수 내부에 선언되기 때문에 이를 변수에 할당하거나, 다른 함수에 전달할 수 없다.

 

람다식 함수의 기본 문법은 다음과 같다.


여기서 capture list 가 잘 이해가 가지 않을 수 있는데, capture list는 다음과 같은 방법을 따른다.

  •  [ ] : 모든 변수를 캡처하지 않는다.
  • [변수1, 변수2, ... ] : 지정된 변수만 캡처한다.
  • [&] : 참조에 의한 캡처를 수행한다.
  • [=] : 복사에 의한 캡처를 수행한다.
  • [&, 변수1, 변수2, ...] : 참조에 의한 캡처를 수행하되, 지정된 변수만 예외로 복사에 의한 캡처를 수행한다.
  • [=, 변수1, 변수2, ...] : 복사에 의한 캡처를 수행하되, 지정된 변수만 예외로 참조에 의한 캡처를 수행한다.

여기서 말하는 캡처란, 일반적인 함수의 매개변수를 받아오는 방법처럼 복사진입, 원본진입 을 말한다.

 

parameters 는 일반적인 함수처럼 매개변수를 받아오는 역활을 한다.

사실 capture 와 parameters 는 독립적으로 구축하여 서로가 서로를 사용하지 않고 람다식 함수 제작이 가능하지만, 각각 역활이 크게 다르다는 사실을 알고 있어야 한다.

 

우선 capture는 함수의 외부변수를 받아오는 역할을 한다. 일반적인 매개변수와는 다르게, 전역으로 선언되어있는 변수를 사용하는것과 비슷한 효과를 발휘한다.

 

parameters는 외부에서 지정된 함수인자를 전달하는 역할을 한다. 함수 선언과 유사하게 매개변수를 작성하여 인자를 전달하는 방식을 말한다. capture와는 다르게 함수의 인자값을 지정하여 입력할 수 있음으로, 외부에서 원하는 인자를 쉽게 전달할 수 있게된다.

 

이러한 차이점을 인지하고 있어야 한다.

 

그 이외에는, 리턴타입을 지정해주고, 함수 동작부를 작성해주면 일반적인 함수와 같은 방식으로 사용할 수 있다.


이렇게 편리한 람다식 함수를 사용할 때 피해야 할 점이 있다.

  1. 람다식 함수의 길이를 길게 하면 안된다.
    • 긴 람다식 함수는 코드의 가독성을 크게 떨어뜨릴 수 있다. 람다식 함수는 짧은 함수를 쉽게 입력하기 위해 사용해야 한다.
  2. 람다식 함수에서는 가능하면 캡처한 변수를 수정하는 행위를 피해야 한다.
    • 생각보다 가독성이 떨어지는 코드방식 이기 때문에, 확인하지 못한 결과가 나타날 수 있다. 정말 예기지 못하게 람다식 함수에서 변수수정을 하버려서 버그가 날 수 있다.
  3. 캡처를 하려는 변수는 보안적 이슈를 일으킬 만한 값을 가지면 안된다.
    • 캡처방식은 원래 가져올 수 없는 변수를 가져와서 사용할 수 있기 때문에 큰 보안이슈가 발생할 수 있다. class에서 프라이빗과 퍼블릭을 왜 분리하여 사용하는지를 생각하면 쉽게 이해할 수 있을것이다.

 

728x90

'컴퓨터 용어 정리' 카테고리의 다른 글

STL_SequnceContainer  (0) 2023.05.28
제네릭 프로그래밍(Generic Programming)  (0) 2023.05.05
C++ algorithm 라이브러리  (0) 2023.05.05
디자인 패턴(Design Pattern)  (0) 2023.04.28
객체지향 설계원칙(SOLID)  (0) 2023.04.28