본문 바로가기
알고리즘, 문제해결/알고리즘, 자료구조

C++의 auto에 대해

by 카펀 2021. 8. 31.

C++에 익숙하다고는 하지만, 맨날 알고리즘 문제풀이만 하던 저에게 최근에 새롭게 알게 된 키워드가 있습니다.

auto 키워드인데, C++11 이후에 추가되었다고 합니다.

 

제가 가장 흔하게 본 상황은 아래와 같은 경우입니다.

 

vector<int> numbers;
for (auto next : numbers) {
	cout << next << " ";
}

 

기존의 방식처럼 for 안에 int i = 0; i < numbers.size()... 와 같은 과정을 거치지 않고, 가독성 있고 편리하도록 코드를 작성할 수 있습니다.

 

하지만 다음과 같은 경우 어떤 결과가 나올까요?

 

vector<int> numbers = {7, 2, 1, 8, 4};
for (auto next : numbers) {
	next *= 2;
}

 

언뜻 보면, numbers 내의 모든 원소의 값에 2를 곱하는 코드로 볼 수 있으나, 실행하면 아래와 같습니다.

 

실행 결과

곱하는 연산이 실행되지 않았냐면, 그건 아닙니다.

10번째 줄에서 곱연산 후에 next를 출력해 보면, 곱한 값이 출력됩니다.

즉, 위처럼 쓰면, numbers[i]의 값을 임시로 특정 변수에 복사하고, 그 변수에 곱연산을 실행한 것과 같은 결과가 나옵니다.

 

그러면 어떻게 하면 될까요?

첫 번째로는 iterator를 이용하는 것입니다 (덜 깔끔한 방법).

 

실행 결과

(위에 짤린 부분은 for (auto it = numbers.begin(); it != numbers.end(); it++) 입니다. )

사용이 된다는 것은 알겠지만, 깔끔하지 못합니다.

 

두 번째로는 &를 붙여서 사용하는 것입니다 (깔끔한 방법).

 

실행 결과

아까 위의 코드에서 & 하나만 붙였더니 원하는 대로 실행이 되었습니다!

&는 변수가 가리키는 주소의 값을 의미하므로, auto가 가리키는 주소의 값에 연산을 했다,

즉 vector의 주소를 찾아가서 곱연산을 했다고 이해할 수 있습니다.

 

auto는 초기화 값에 따라 데이터 타입을 알아서 정해주는 키워드입니다.

Python을 예로 들면, 변수명을 정하고 값을 넣으면 변수 타입이 알아서 할당되는데,

그것과 유사한 역할을 한다고 보시면 될 것 같습니다.

 

변수 타입 자동 할당

위처럼 갖가지 다른 타입의 값을 auto 타입의 변수에 할당하면, 오류 없이 정상적으로 컴파일 됩니다.

 

커서를 올려보면 데이터 타입을 알 수 있습니다.

위처럼 커서를 올려보면 auto가 감지한 변수 타입이 나옵니다.

 

이러한 auto를 포인터 변수 *, &와 한정자 (const)와 함께 사용하면 매우 편리합니다.

특히 for문을 이용할 때, 그냥 사용하면 복사비용이 추가로 들기 때문에 const & 등을 활용할 수 있습니다.

 

 

 

참고한 글:

https://blockdmask.tistory.com/384

'알고리즘, 문제해결 > 알고리즘, 자료구조' 카테고리의 다른 글

느리게 갱신되는 세그먼트 트리  (0) 2021.09.26
세그먼트 트리  (0) 2021.09.25
[SQL] String, Date  (0) 2021.03.11
[SQL] JOIN  (0) 2021.03.11
[SQL] is Null  (0) 2021.03.11

댓글