[c++] 반복문에서 전위 후위 연산자
[c++] 반복문에서 전위 후위 연산자
C++ 전위 증가(++i)와 후위 증가(i++)의 차이점
C++에서 전위 증가와 후위 증가는 비슷해 보이지만, 동작 방식과 성능 측면에서 차이가 있습니다. 특히 사용자 정의 타입에서는 그 차이가 명확하게 나타납니다.
1. 동작 방식
전위 증가 (++i)
- 변수를 먼저 증가시킨 후, 증가된 값을 반환합니다.
- 복사본을 만들지 않고, 자기 자신을 참조로 반환합니다.
1
2
int i = 0;
int a = ++i; // i를 1로 증가한 뒤, a에 1 대입
후위 증가 (i++)
- 현재 값을 먼저 반환한 후, 변수를 증가시킵니다.
- 내부적으로 복사본을 생성하여 반환한 후, 원본 값을 증가시킵니다.
1
2
int i = 0;
int a = i++; // a에 0을 대입한 뒤, i는 1로 증가
2. 성능 차이
기본 데이터 타입 (int, float 등)
- 컴파일러가 최적화를 잘 해주기 때문에 전위 증가와 후위 증가의 성능 차이는 거의 없음.
사용자 정의 타입 (클래스, STL 반복자 등)
- 후위 증가(i++)는 복사본 생성 비용이 추가되기 때문에, 전위 증가(++i)보다 비효율적일 수 있음.
예시:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Counter {
public:
Counter& operator++() { // 전위 증가
++value;
return *this;
}
Counter operator++(int) { // 후위 증가
Counter temp = *this;
++value;
return temp;
}
private:
int value;
};
후위 증가에서는 Counter temp = *this;와 같이 복사본이 생성되므로 비용이 발생함.
3. 실제 사용 사례
루프에서 기본형 사용
1
for (int i = 0; i < n; ++i) { ... }
- 기본형에서는
i++와++i의 성능 차이가 없으므로 스타일에 따라 자유롭게 사용.
STL 반복자 사용
1
for (auto it = container.begin(); it != container.end(); ++it) { ... }
- 반복자와 같은 사용자 정의 타입에서는 항상
++i(전위 증가)를 사용하는 것이 권장됨.
4. 요약
| 구분 | 전위 증가 (++i) | 후위 증가 (i++) |
|---|---|---|
| 동작 방식 | 증가 후 반환 | 반환 후 증가 |
| 복사본 생성 여부 | 없음 | 있음 |
| 기본형 성능 차이 | 없음 | 없음 |
| 사용자 정의 타입 | 빠름 | 느림 |
5. 권장사항
- 기본형(int, float 등): 자유롭게 사용해도 무방.
- 사용자 정의 타입(STL 반복자 등):
++i(전위 증가) 사용을 습관화하는 것이 안전하고 효율적.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.