이번 회부터 VSTS 2010의 VC++(버전 명으로는 VC++ 10)의 새로운 기능에 대해서 하나씩 설명하려고 합니다. C++의 새로운 표준이될 C++0x의 스펙 중 VSTS 2010에 새로 구현된 것 중 'auto'라는 Keyword를 설명하겠습니다.
정적 언어와 동적 언어의 차이
근래에 Ruby나 Python과 같은 스크립트 언어가 인기를 얻고 있습니다. Ruby나 Python 같은 언어를 '동적 언어' 라고 합니다. 반대로 제가 주로 사용하는 언어인 C/C++는 '정적 언어'라고 합니다.
정적 언어는 변수 type을 정의할 때 명시적으로 지정해야 합니다.
반대로 동적 언어인 Ruby,Python 은 변수 type을 명시적으로 지정할 필요가 없어서 편리합니다.
< Code.1 C/C++과 Ruby에서의 지역 변수 정의 >
void BuyItem()
{
int Money = 500;
........
}
- Ruby에서 변수 정의
def BuyItem
Money = 500;
......
end
C#의 var
C#은 C/C++과 같은 정적 언어이지만 var 라는 키워드를 사용하여 변수 type을 명시적으로 지정하지 않아도 됩니다. 동적 언어들과의 차이점은 변수의 type이 런 타임이 아닌 컴파일 타임 때 결정됩니다.
C#의 var 키워드를 사용하면 코딩 시 번거롭거나 코드 가독성에 도움이 되지 않는 코드에 유용합니다. 그래서 C#의 경우 LINQ를 사용할 때 자주 사용합니다.
< Code.2 LINQ에서 var를 사용할 때와 사용하지 않을 때 >
IEnumerable<IGrouping<string, Student>> studentQuery3 =
from student in students group student by student.Last;
- LINQ에서 var를 사용한 경우
var studentQuery3 = from student in students group student by student.Last;
var를 사용하여 코딩 량도 줄어들고 코드 가독성도 좋아졌습니다.
C++에서 템플릿(Template)을 사용할 때 불편한 점
C++의 경우 Template을 사용할 때 위 <Code.2>에서 var를 사용하지 않을 때 처럼 템플릿 파라메터를 넣어줘야 되기 때문에 불편하여 C#의 var와 같은 것이 있으면 아주 유용합니다.
< Code.3 C++의 템플릿 사용 >
map<T_CHARACTER_TYPE_CLASS*, SkillHandlerCaller3<T1, T2, T3>*>::iterator itr = SkillHandlerCaller.begin();
위와 같은 불편함을 없애기 위해 C++0x에서 새로 만드어진 키워드가 auto 입니다.
C++0x의 새로운 Keyword 'auto'
auto를 사용하면 변수를 정의할 때 명시적으로 type을 지정하지 않아도 됩니다. auto로 정의한 변수를 초기화할 때 type이 만들어집니다. 즉 C#의 var와 같이 컴파일 타임 때 type이 결정됩니다.
auto 키워드는 C#의 var와 비슷하고 복잡한 것이 아니니 '변수를 정의할 때 명시적으로 type을 지정하지 않고 컴파일 타임 때 결정'하게 하는 키워드라고 기억하시면 됩니다.
그럼 어떻게 사용하는지 아래의 예제를 봐 주세요.
1. 지역 변수로 사용
문자열을 담을 변수을 auto를 사용하여 정의하면 아래와 같습니다.
< Code.4 문자열 변수에 auto 사용 >
cout << "NPC Name : " << NPCName << endl;
< 결과 >
당연히 포인터나 참조, const도 사용할 수 있습니다.
< Code.5 포인터, 참조, const에 사용 >
cout << "UserMode : " << UserMode << endl;
auto* pUserMode = &UserMode;
cout << "pUserMode : Value - " << *pUserMode << ", address : " << pUserMode << endl;
auto& refUserMode = UserMode;
refUserMode = 5;
cout << "UserMode : Value - " << UserMode << " | refUserMode : Value - " << refUserMode << endl;
const auto& crefUserMode = UserMode;
< 결과 >
2. 클래스 정의에 사용
클래스를 정의할 때도 사용할 수 있습니다.
< Code.6 클래스 생성 때 auto 사용 >
{
int SlotNum;
int ItemCode;
};
........
..........
auto* CharInven = new CharacterInvenInfo();
4. Template에 사용
auto 키워드는 Template 프로그래밍에서 진가를 발휘합니다.
STL의 vector의 이터레이터를 정의할 때 사용하면 <Code.2>의 var를 사용하는 LINQ와 같은 효과를 얻을 수 있습니다.
< Code.7 vector의 이터레이터 변수에 auto 사용 >
vector< int > ItemCodeList;
ItemCodeList.push_back( 20 );
ItemCodeList.push_back( 30 );
ItemCodeList.push_back( 40 );
for( auto IterPos = ItemCodeList.begin(); IterPos != ItemCodeList.end(); ++IterPos)
{
cout << "ItemCode : " << *IterPos << endl;
}
cout << endl;
cout << "Use vector Iterator - 2" << endl;
vector< Item > ItemList;
Item item1; item1.ItemCode = 1; item1.Money = 100; item1.SkillCode = 0;
Item item2; item2.ItemCode = 2; item2.Money = 200; item2.SkillCode = 10;
Item item3; item3.ItemCode = 3; item3.Money = 300; item3.SkillCode = 0;
ItemList.push_back( item1 );
ItemList.push_back( item2 );
ItemList.push_back( item3 );
for( auto IterPos = ItemList.begin(); IterPos != ItemList.end(); ++IterPos)
{
cout << "ItemCode : " << IterPos->ItemCode
<< ", Money : " << IterPos->Money << endl;
}
cout << endl;
< 결과 >
auto가 없을 때는 STL의 컨테이너를 사용할 때 typedef를 사용하였지만 auto가 생겨서이제 typedef가 필요 없게 되었습니다.
LIST_COMMAND::iterator iter = m_listCommand.begin();
C#의 var 키워드에 대해 알고 계시는 분들은 쉽게 C++의 auto 키워드를 이해할 수 있을 것입니다. C#을 모르는 분들이라도 위의 예제 코드를 보시면 auto가 어떤 것인지, 어떻게 사용하는지 알수 있으리라 생각합니다.
auto의 핵심을 요약하면
1. 변수 정의 때 명시적으로 type을 지정하지 않아도 된다.
2. auto로 정의한 변수는 초기화할 때 type이 결정된다.
3. 컴파일 타임 때 type이 결정된다.
4. 템플릿 프로그래밍에 사용하면 코딩이 간편해지고. 코드 가독성이 좋아진다.
ps : C++0x가 무엇을 뜻하는지 모르는 분들이 있을 것 같아서 위키피디아에 있는 설명을 옮겨봅니다.
"C++0x는 2009년 1월 현재 개발중인 C++ 언어 표준으로, 이 표준은 1998년 발표(C++98), 2003년 개정(C++03)된 ISO/IEC 14882를 대체한다. 이 개정에는 언어 차원에서의 변화, 표준 라이브러리의 변화 등이 모두 포함된다. C++0x에서 발표한 가장 최근의 기술 문서는 N2800(2008년 10월)이다."
'C++0x' 카테고리의 다른 글
| [VC++] 6. 우측 값 참조( RValue Reference ) - 세 번째 (0) | 2009/05/09 |
|---|---|
| [VC++] 5. 우측 값 참조( RValue Reference ) – 두 번째 (2) | 2009/05/06 |
| [VC++] 4. 우측 값 참조( RValue Reference ) - 첫 번째 (2) | 2009/05/04 |
| [VC++] 3. static_assert (0) | 2009/04/27 |
| [VC++] 2. C++0x의 auto (6) | 2009/04/23 |
| [VC++] 1. 큰 변화가 기대되는 Visual C++( VC++ ) (4) | 2009/04/21 |




댓글을 달아 주세요
잘 보고 갑니다. 빨리 사용해 보고 싶군요^^
정식 버전이 나오기전까지 boost 라이브러리를 사용하면 새로운 C++ 표준 기능을 맛 볼수 있습니다.
정말 확실히 코드가 줄고 보기 좋아지겠는데요..
auto 키워드 또한... 정말 굉장합니다.......
그런데.. 안그래도 C++의 느린 컴파일타임이 더 느려지지 않았을까..
심히 걱정이 됩니다.. ㅠㅠ
이번 버전부터 인텔리전스는 새로 만들었고 컴파일러를 상당히 개선하고 있습니다. 제 생각에 이전 버전보다 느려지지는 않으리라 생각합니다. 실제 PGO로 빌드하면 이전보다 더 빨라졌다고 합니다.
std::map에 insert 할 때,
value_type()을 정할 때는 어떤 방식으로 하시고들 계시나요..?