<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="html">김 용묵의 절대공간 - 블로그: C11의-람다-함수에 달린 최근 댓글/트랙백 목록</title>
  <id>http://moogi.new21.org/tc/</id>
  <link rel="alternate" type="text/html" hreflang="ko" href="http://moogi.new21.org/tc/" />
  <subtitle type="html">그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.</subtitle>
  <updated>2024-10-03T10:36:33+09:00</updated>
  <generator>Textcube 1.7.8 : Con moto</generator>
  <entry>
    <title type="html">주의사신님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3208" />
    <author>
      <name>(주의사신)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3208</id>
    <published>2012-05-24T09:22:50+09:00</published>
    <summary type="html">Closure와 변수 캡처에 대한 내용은 들어가지 않았군요...

Closure를 사용하면, 지역 변수를 함수 내의 전역 변수처럼 사용할 수 있다는....

Closure 처음 보면 진짜 이상합니다. 그런데 알고 나면 무척 편합니다.</summary>
  </entry>
  <entry>
    <title type="html">김 기윤님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3209" />
    <author>
      <name>(김 기윤)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3209</id>
    <published>2012-05-24T10:10:39+09:00</published>
    <summary type="html">람다는 기존에는 없었던 생소한 개념이지만, 익숙해지면 정말 편하죠.

어떠한 함수 안에서 이 함수 안에서만 쓰이는 것이라면 람다로 즉석 선언 ㄳ

PPL 라이브러리나 STL과의 결합도도 ㄳ

아, 그리고 람다에 대해서는 auto 가 필수가 아닙니다.

#include &amp;lt;functional&amp;gt;
으로 functional 을 인클루드 한 뒤에,
std::function&amp;lt;리턴형(인수1, 인수2, 인수3)&amp;gt;
형식으로 선언하면, 같은 형식의 람다함수를 저장할 수 있습니다.(당연히 using namespace std; 했다면, std:: 는 생략가능)

예를 들어,
std::function&amp;lt;void(int, int, Player&amp;amp;, Player&amp;amp;, int, int)&amp;gt; command;
이런 식으로 정의를 했다면,
command = [](int self, int target, Player&amp;amp; player, Player&amp;amp; foes, int currentAbilityIndex, int turn) { /* ... */ }
는 식으로 대입이 가능합니다.
저는 이런 식으로 클래스 멤버변수로 람다함수를 가지는 코드도 만든 전적이 있습니다. (전략 패턴으로 쓰기 위해서 ㄳ. 특징상 전략 패턴에 쓰기에도 딱 맞더군요)

따라서 이런 응용도 가능합니다.

typedef function&amp;lt;pair&amp;lt;int, int&amp;gt;(pair&amp;lt;int, int&amp;gt;)&amp;gt; func;
func modifier[3] = 
{
    [] (pair&amp;lt;int, int&amp;gt; p) -&amp;gt; pair&amp;lt;int, int&amp;gt; {
        // 가로, 세로 유지
        return p;
    },
    [] (pair&amp;lt;int, int&amp;gt; p) -&amp;gt; pair&amp;lt;int, int&amp;gt; {
        // 가로, 세로 반전
        return make_pair&amp;lt;int, int&amp;gt;(p.second, p.first);
    }, 
    [] (pair&amp;lt;int, int&amp;gt; p) -&amp;gt; pair&amp;lt;int, int&amp;gt; {
        // &amp;quot;가로, 세로&amp;quot; 를 &amp;quot;섹션별, 섹션내&amp;quot; 로
        return make_pair&amp;lt;int, int&amp;gt;(p.first / 3 * 3 + p.second / 3, p.first % 3 * 3 + p.second % 3);
    }
};
for(int f = 0; f &amp;lt; 3; f++)
{
     // ..
     pair&amp;lt;int, int&amp;gt; point = modifier(i, j);
     // ..
}


잘 생각해보니 다른 응용으로는 람다 함수를 뱉어내는 팩토리도 만들 수 있을 듯 합니다 ㅎㄷㄷ</summary>
  </entry>
  <entry>
    <title type="html">사무엘님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3210" />
    <author>
      <name>(사무엘)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3210</id>
    <published>2012-05-24T10:21:20+09:00</published>
    <summary type="html">네, 본문에서는 그런 게 있다는 것만 언급하고 그것까지 구체적인 예를 들지는 (귀찮아서-_-) 않았습니다.
그렇게 자신 바깥의 context까지 끌어들이는 개념이 있기 때문에 람다 함수는 더욱 함수 포인터와 동등한 개념이 될 수 없고 그걸 초월하여 더 상위에 있는 개념이 되겠죠.
어떤 함수 안에서 또 반복되는 코드 블록을 간추릴 필요가 있을 때 #define의 역할을 잘 대체할 수 있습니다.</summary>
  </entry>
  <entry>
    <title type="html">사무엘님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3211" />
    <author>
      <name>(사무엘)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3211</id>
    <published>2012-05-24T10:21:27+09:00</published>
    <summary type="html">보충 설명에 감사합니다.
람다가 auto 말고 다른 곳에 대입 가능하다는 건 완전 처음 듣네요...!
리턴형(인수1, 인수2, 인수3) ... 이건 템플릿 인자로만 지정 가능한 타입이고 전적으로 람다를 위해서 C++11에서 새로 추가된 문법인 거겠죠?
C++ 라이브러리도 다 C++ 문법 위에서 만들어진 코드일 테니 저는 언어적인 근간을 더 먼저 따져 보는 걸 좋아합니다.</summary>
  </entry>
  <entry>
    <title type="html">김 기윤님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3212" />
    <author>
      <name>(김 기윤)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3212</id>
    <published>2012-05-24T10:37:15+09:00</published>
    <summary type="html">MSDN에 찾아보니(..어쩌다가 사용법만 알고 MSDN은 지금 처음 가봤습니다 ㄳ) 딱히 람다만들 위한 건 아닌 것 같습니다.
http://msdn.microsoft.com/ko-kr/library/bb982519

리턴형(인수1, 인수2, 인수3) 은 저도 여기에서 처음 본 타입이기에 저도 생소한데, 더 알아봐야겠습니다.</summary>
  </entry>
  <entry>
    <title type="html">Lyn님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3213" />
    <author>
      <name>(Lyn)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3213</id>
    <published>2012-05-24T13:59:08+09:00</published>
    <summary type="html">http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&amp;amp;MAEULNO=20&amp;amp;no=8580&amp;amp;page=1

사무엘님 제가 얼마전 올린 글입니다. 참고삼아 보셔도 괜찬을것 같습니다.

C++11에 새로 추가된 문법은 아니고 boost에서 개발하여 c++11에 정식으로 추가된 범용 함수객체와 바인더, 플레이스홀더 라이브러리 입니다.
문법이 아니라 템플릿의 타입추론을 이용하여 라이브러리 레벨에서 구현된겁니다.
C++11을 지원하는 컴파일러엔 std::function 으로 사용 가능하고 그 이전의 컴파일러라면 boost 설치 후 boost::function 으로 사용 가능합니다</summary>
  </entry>
  <entry>
    <title type="html">Lyn님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3214" />
    <author>
      <name>(Lyn)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3214</id>
    <published>2012-05-24T14:00:18+09:00</published>
    <summary type="html">그런데 왜 내가 쓴 주소는 링크가 안걸리는거야 Orz</summary>
  </entry>
  <entry>
    <title type="html">사무엘님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3215" />
    <author>
      <name>(사무엘)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3215</id>
    <published>2012-05-25T14:47:55+09:00</published>
    <summary type="html">흐.. 덕분에 난생 처음 보는 C++ 문법을 새로 알게 됐군요. C++의 세계는 너무 오묘합니다.

template&amp;lt;typename T&amp;gt;
class MyObject {
public:
    T m_dat;
};

이런 템플릿 클래스에다가 타입을 아래와 같이 명시해 주면 m_dat는 멤버 변수가 아니고 함수 포인터도 아닌 정식 멤버 함수가 됩니다. 이 문법 자체는 C++11 이전부터 존재해 온 듯합니다.

MyObject&amp;lt;int(int)&amp;gt; mp;
int n=mp.m_dat(1);

MyObject&amp;lt;void(double, double)&amp;gt; mq;
mq.m_dat(1.0, 2.0);

“타입( [타입 [, 타입]] )”과 같은 타입 지정자는 여타 타입 지정과는 달리, 템플릿 인자로만 줄 수 있는 문법이겠지요.
그렇게 해 준 뒤에는 사용되는 타입별로 m_dat 함수를 따로 구현해 줘야 합니다.

template&amp;lt;&amp;gt;
int MyObject&amp;lt;int(int)&amp;gt;::m_dat(int x)
{ return x*x; }

template&amp;lt;&amp;gt;
void MyObject&amp;lt;void(double, double)&amp;gt;::m_dat(double x, double y)
{ return x*y; }

결국 템플릿 인자와 함수 자체의 인자에 동일한 함수 프로토타입이 두 번 명시되는 꼴이군요.
이걸 안 하고서 m_dat 호출만 하면 코드가 컴파일은 되지만 결국 링크 에러가 납니다.

템플릿 함수라도 타입이 명확하게 지정되어 있는 특화된 몸체는 다른 번역 단위(소스 코드)에 있어도 괜찮습니다.
그에 반해 typename이라는 것만 명시되어 있는 추상적인 몸체는, 사용되는 모든 번역 단위에서 일일이 인클루드되어야 사용 가능합니다.

그것도 외부 번역 단위에서 알아서 끌어다 쓸 수 있게 하려고 제안되었던 기능이 export 키워드인데 완전히 흑역사로 전락했고, C++11에서는 보류 정도가 아니라 삭제되어 버린 것 아시죠?
단순히 변수 타입 정도가 아니라 멤버 함수와 람다까지 왔다갔다 할 수 있는 템플릿은 그 유연함이 가히 #define에 맞먹는 수준인데, 그 모든 가능성을 그것도 기계어 코드 컴파일 언어에서 export 가능하려면 컴파일러와 링커를 다 새로 만들지 않고서는 불가능할 겁니다.

아무리 생각해도 T가 멤버 함수까지 가리킬 수 있는 건 좀 흉악(?)한 것 같습니다.
typename이라는 키워드가 있는 것처럼 funcname 같은 다른 힌트 지정자라도 있는 게 낫지 않을까 싶기도 하군요.
또한, C++ 멤버 함수와 람다 함수는 직접적으로 관계가 있는 게 아닌데 std::function 클래스는 아무리 템플릿이라 해도 어떻게 람다와 곧장 직결이 가능한지 모르겠습니다.

함수 호출 규약이나 기계어 메모리 구조와 관련된 트릭을 쓰기라도 한 건지, 라이브러리 소스를 봐서는 모르겠고요. (온갖 외계어 같은 #define과 typedef 꼼수들.. -_-)
그 기능만을 위한 문법이 따로 존재하는 게 아니라면 어떤 형태로든 꼼수가 안 들어갈 수는 없을 텐데요.

그리고 xcode에서는 MyObject&amp;lt;int(int)&amp;gt;와 같은 문법이 컴파일이 안 되더군요. #include &amp;lt;functional&amp;gt;을 해도 std::function라는 명칭 자체도 없고요. C++11 표준이 일부 반영되어 있음에도 불구하고 그쪽은 지원되지 않는 듯합니다.

그나저나,
1. 본이 아니게 댓글이 무진장 길어졌는데, 이거 조만간 본문으로 옮길 예정.
2. 링크가 걸리는 URL도 있고, 안 걸리는 URL도 경험상 있는데, 정확한 차이는 저도 잘 모르겠습니다.</summary>
  </entry>
  <entry>
    <title type="html">김재주님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3216" />
    <author>
      <name>(김재주)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3216</id>
    <published>2012-05-25T20:07:01+09:00</published>
    <summary type="html">람다 함수는 뭐 자바스크립트 루비 파이썬 등등 요새 많이 사용되는 언어에는 거의 있죠. 근데 C++에도 들어가게 되다니 이거 참...... 제가 컴파일러 쪽은 잘 모르다보니 어떻게 인터프리터 언어도 아닌 C++에서 어떻게 클로져를 구현한 건지 모르겠네요. 생각 좀 해봐야 되나</summary>
  </entry>
  <entry>
    <title type="html">김 기윤님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3217" />
    <author>
      <name>(김 기윤)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3217</id>
    <published>2012-05-26T00:56:14+09:00</published>
    <summary type="html">후후(?).. 덕분에 저도 즐겁게 배우고 갑니다.

댓글에서 즐겁게 놀아본 건 오랜만인 듯 하기도 하구요.</summary>
  </entry>
  <entry>
    <title type="html">김재주님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3218" />
    <author>
      <name>(김재주)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3218</id>
    <published>2012-05-26T10:40:25+09:00</published>
    <summary type="html">아 그런데 C++의 람다함수는 자기 자신을 호출할 방법이 없나요? 자바스크립트의 경우는

var f = function factorial(n) { if(n==1) return 1; else return factorial(n-1) * n;} 같은 식으로 선언이 가능한데요</summary>
  </entry>
  <entry>
    <title type="html">사무엘님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3219" />
    <author>
      <name>(사무엘)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3219</id>
    <published>2012-05-26T16:48:03+09:00</published>
    <summary type="html">아무래도 이름이 없는 함수라면 자기 자신을 일컬을 방법이 특별한 예약어라도 있지 않으면 없겠지요?
그건 저도 잘 모르겠네요.</summary>
  </entry>
  <entry>
    <title type="html">Lyn님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3220" />
    <author>
      <name>(Lyn)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3220</id>
    <published>2012-05-29T10:04:56+09:00</published>
    <summary type="html">C++의 람다도 std::function&amp;lt;형식&amp;gt; f = 람다식; 처럼 가능합니다.

C++에서의 클로저는... 그냥 functor랑 내부구현은 비슷하다고 보셔도 틀리지 않을겁니다.
캡쳐한 변수를 멤버로 가지는 구조체를 만들고 this-&amp;gt;func() 을 호출해버리는거죠</summary>
  </entry>
  <entry>
    <title type="html">Scavenger님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3233" />
    <author>
      <name>(Scavenger)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3233</id>
    <published>2012-06-01T10:58:15+09:00</published>
    <summary type="html">잘보고 갑니다. 다음에는 C++11의 큰 변화 중 하나인 R-Value 에 대해서도 다루어주세요.</summary>
  </entry>
  <entry>
    <title type="html">사무엘님의 댓글</title>
    <link rel="alternate" type="text/html" href="http://moogi.new21.org/tc/686#comment3235" />
    <author>
      <name>(사무엘)</name>
    </author>
    <id>http://moogi.new21.org/tc/686#comment3235</id>
    <published>2012-06-01T12:19:08+09:00</published>
    <summary type="html">반갑습니다. R-value 참조자에 대해서는 바로 얼마 전에 쓴 글에 다뤄져 있습니다. 참고하세요. ^^
http://moogi.new21.org/tc/683</summary>
  </entry>
</feed>
