반응형

C++11 : 연역적 선언 auto (입문)

알게된 배경

 혼자 프로젝트를 진행을 하다 보니 가능하면 최신(2017년에 2011년에 재정된 표준을 사용하는 것이 과연 최신 일까?) 표준을 사용하기 위해서 공부하면서 알게 된 것들이다. 최신 기술이 항상 좋은 건 아니지만, 새로운 기술은 항상 이전 기술을 사용하면서 축적된 경험으로 부터 개선점이 나오기 때문에 반대로 나쁘다고만 할 수 도 없고 생각든다.

 해당 내용은 effective modern c++를 많이 참조했다.


auto 키워드

 C++98 에서도 존재하던 키워드였지만, C++11에서 급진적으로 바뀐 키워드중 하나다. 즉, C++98에도 역할이 다른 키워드이니 C++11을 경계로 이전 버전에서는 호환이 안된다. 다만, 다행스러운건 이전 버전에서는 거의 사용이 안되던 키워드였기 때문에 웬만하면 큰 문제가 발생되지 않는다.


 적절한 한글 명칭으로는 '연역적 형식선언' 정도 붙일 수 있다. auto 키워드는 JS와 C#에 존재하는 var와 유사한 역할을 한다. 즉, 객체 혹은 변수를 선언할때 초기화 하는 값에 의해서 형이 정해지는 것이다.

예시)

int a1 = 10;
auto a2 = 10;    // a1 == a2

int b1;
b1 = 10;
auto b2;    // error
b2 = 10;




 초기화 하는 형이 있어야 형을 선언할 수 있기 때문에 반드시 초기화를 해야 하며, auto 키워드는 변수형 뿐만 아니라 객체로도 사용되기 때문에 STL의 iterator를 선언할 경우 상당히 많은 코드를 줄일 수 있다.

예시)

std::vector<int> arrVec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it1 = arrVec.begin();
auto it2 = arrVec.begin();
// it1[1] == it2[1]




장점

 auto 를 사용함으로써 얻는 장점은 3가지로 자주 언급이 된다.

1. 코드의 길이가 줄어듬

2. 초기화 강제화로 실수가 줄어듬

3. 코드의 유지보수(리펙토링)가 쉬워짐

4. 형 선언 실수를 방지할 수 있음


사실 STL의 자료형을 많이 사용해본 입장에서는 1, 2번의 장점이 매우 크게 느껴진다.


단점

1. 대리자(proxy) 형식 때문에 형식을 잘못 연역하는 경우가 있음

2. 코드만 봤을때 직관적이지 않음(이는 IDE의 부가 기능으로 어느정도 해결 할 수 있음)


 1번의 경우 대표적인 예로 vector<bool> 형이 많이 거론된다. bool 값은 추상적으로 1비트로 표시할 수 있기 때문에 vector 템플릿은 bool 형을 받으면 비트형으로 저장을 하게 된다. 즉, vector<bool> bVec(5)를 선언하면, bVec는 1바이트의 5비트를 갖고 있는 것이다. 문제는 C++은 바이트 단위로 처리를 하기 때문에 bool형은 실제로 바이트로 되어 있는데, 이러한 자료형의 이질성을 해소하기 위해 중간에 대리자라는 형식이 존재한다.


 문제는 이렇게 중간에 껴있는 대리자를 통하여 포인터를 넘겨 받을 경우 대리자가 어떻게 구현되었는지에 따라 영향을 받게 된다. 이러한 경우 경우에 따라 연역적 형 선언에 실패하게 된다. 따라서 이러한 경우 명시적으로 선언을 해줘야 한다.


결론

 이러한 auto 키워드 사용은 권장이지 의무는 아니다. 하지만, 장점과 단점을 생각해서 사용하는 것이 더욱 즐겁고 효율적인 코딩이 될 것이다.


참조자료

Effective Modern C++

반응형

+ Recent posts