Visual Studio 2010 공식 팀 블로그 @vsts2010

[VC++] 2. C++0x의 auto

C++0x 2009/04/23 01:04
Posted by 흥배

이번 회부터 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에서의 지역 변수 정의 >

- C/C++에서 변수 정의
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를 사용할 때와 사용하지 않을 때 >

- 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++의 템플릿 사용 >

- STL의 map 컨테이너에서 사용하는 경우 이터레이터 정의
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 사용 >

auto NPCName = "KKamahui";
cout << "NPC Name : " << NPCName << endl;

< 결과 >


당연히 포인터나 참조, const도 사용할 수 있습니다.
< Code.5   포인터, 참조, const에 사용 >

int UserMode = 4;
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 사용 >

struct CharacterInvenInfo
{
    int SlotNum;
    int ItemCode;
};
........
..........
auto* CharInven = new CharacterInvenInfo();


4. Template에 사용

auto 키워드는 Template 프로그래밍에서 진가를 발휘합니다.

STL의 vector의 이터레이터를 정의할 때 사용하면 <Code.2>의 var를 사용하는 LINQ와 같은 효과를 얻을 수 있습니다.

< Code.7   vector의 이터레이터 변수에 auto 사용 >

cout << "Use vector Iterator - 1" << endl;
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가 필요 없게 되었습니다.

typedef std::list<MCommand*> LIST_COMMAND;
LIST_COMMAND::iterator iter = m_listCommand.begin();
 를 아래처럼 바꿀 수 있습니다.

auto 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월)이다."

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 잘 보고 갑니다. 빨리 사용해 보고 싶군요^^

    • 정식 버전이 나오기전까지 boost 라이브러리를 사용하면 새로운 C++ 표준 기능을 맛 볼수 있습니다.

  2. 정말 확실히 코드가 줄고 보기 좋아지겠는데요..

  3. 와우... 2010/01/27 06:29

    auto 키워드 또한... 정말 굉장합니다.......
    그런데.. 안그래도 C++의 느린 컴파일타임이 더 느려지지 않았을까..
    심히 걱정이 됩니다.. ㅠㅠ

    • 이번 버전부터 인텔리전스는 새로 만들었고 컴파일러를 상당히 개선하고 있습니다. 제 생각에 이전 버전보다 느려지지는 않으리라 생각합니다. 실제 PGO로 빌드하면 이전보다 더 빨라졌다고 합니다.

  4. 치킨마요 2010/12/02 10:37

    std::map에 insert 할 때,
    value_type()을 정할 때는 어떤 방식으로 하시고들 계시나요..?