포스트

[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 라이센스를 따릅니다.