이번 회부터 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월)이다."

- Diary (24)
-
Computer Science
(36)
- Testing
- .NET Related (15)
- Etc. (5)
- Automobile (1)
- Salsa (1)
- Etc. (10)
- Travel (1)
- Diary-Past (2467)








- +_+ wish~
- 언젠가는 한번 가보고 싶은...
- 곰팡이 제거 스프레이등.
- 이제 크게 써야하는 부분이...
- 지친다 지쳐... ㅠㅠ
- 사진첩 옮기다가 완전 GG...
- 아 사진첩 옮겨야하는데.. ...
- 1번, 5번 완료.






