올해 초까지만 해도 저는 C++코드에서 for문을 돌릴 때 i++를 사용했었습니다. 하지만 어디선가 우연히 주워들은 내용을 바탕으로 i++를 사용하면 컴파일러가 알아서 ++i로 바꿔준다는 이야기를 듣고 나서 컴파일러의 고생을 조금 더 줄여주기 위해서 ++i을 사용하고 있습니다.  실제로 ++i의 경우 i를 증가시켜주지만, i++는 현재 값을 반환하고 나서 값을 증가시키기 때문에 추가적으로 메모리를 사용합니다.

 

오늘 객체지향프로그래밍 수업을 들으면서 이 내용이 다시 등장해서 반가웠습니다. 이미 알고 있던 사실이었기 때문에 반가운 부분도 있었지만, 내가 완전히 이해하고 있는 것은 아니었다는 사실도 알 수 있었습니다. (바로 대답 못하고 조금 버벅였습니다 ^^;;) 이 내용은 그렇게 어렵지 않기도 하고 많이 사용되는 요소도 아니지만, 사용자 정의 클래스에서는 i++를 ++i로 바꿔주는 기능을 따로 만들어주지 않으면 연산속도에 차이가 나게 됩니다. 또한 i++가 반드시 필요한 부분이 있다면 확실히 이해하고 사용해야 하지 않을까요? 이렇게 공부를 해야하는 이유가 또 하나 생겼습니다!

 

그렇다면 두 연산자의 차이에 대해서 조금 더 자세히 알아보겠습니다.

 

목차


    0. 전위연산자(++i)

    간단합니다. i에 1을 더해줍니다. 대신 중요한 점이 있다면 전위연산자는 다른 수식이 계산되기 전에 먼저 연산되고 그 결과를 객체로 반환합니다.

     

    이 말이 이해가 잘 안될 수 있기 때문에 예시를 추가합니다!

    int x = 20;
    ++x = 100;
    cout << x << endl;

    ++x가 lvalue에 있어서 돌아가지 않을 것 같지만, 실제로는 잘 돌아갑니다.

     

    동작을 하나하나 뜯어보면 먼저 x를 1 증가시킨 후에 x에 100을 넣어서 100이 출력됩니다.

    x가 증가한 후에 숫자가 아닌 객체로 반환된다는 사실을 꼭 기억해야겠죠!!!!

     

    - x의 변화과정

    (0) x = 20

    (1) x = 21

    (2) x = 100


    1. 후위연산자(i++)

    값이 1 증가하는 것은 같습니다. 하지만 전위연산자와 다르게 추가로 신경써야 할 부분은 후위연산자가 들어가 있는 연산을 진행한 후에 값이 변화한다는 점입니다. 

    변화한 값을 나중에 가져와야 하기 때문에 추가적인 메모리가 필요합니다.

     

    아마도 아직 이해가 잘 안 될 겁니다.

    그렇다면 아래 예시를 보면서 조금 더 잘 이해해보시죠!

    int y = 30;
    y++ = 30; // 에러 발생
    cout << y << endl;

    위 식은 단지 ++를 뒤에 붙였을 뿐이지만 오류가 발생합니다.

    동작을 뜯어보면, y에 30을 할당한 후에, y++ = 30;을 할 때 오류가 발생합니다.

    y++는 30에 1을 더한 31을 임의의 메모리에 저장해놓고, 30을 반환합니다.

     

    즉, 전위연산자는 객체를 반환하고, 후위연산자는 을 반환합니다.

     

    그럼 이제 오류가 발생한 원인에 대해서도 확인을 해야겠죠?

    y++는 값을 반환한다는 것을 알았습니다.

    그렇다면 y++ = 30이라는 식은,

    30 = 30, temp = 31 이라는 말과 같게 됩니다. (temp는 임의의 메모리라고 가정합니다.)

    31은 그 줄의 연산이 끝난 후에 나중에 y에 들어가게 되는 것이죠.

     

    30 = 30, 상수에 상수를 대입한다, 당연히 오류가 나겠죠? 왼쪽 피연산자가 수정할 수 없는 상수이기 때문에 컴파일 과정에서 2106이라는 오류가 발생합니다. lvalue는 수정할 수 없는 값이니까요.


    2. 예시코드

    보다 확실하게 출력해서 알아보기 위해서 아래와 같은 코드를 돌려보겠습니다.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int x = 20;
        ++x = 100;
        cout << x << endl;
        
        int y = 30;
        // (y++) = 30; 오류 발생
        y = x++;
        cout << x << " " << y << endl;
        return 0;
    }
    

     

    ++x는 21이 들어가 있는 x라는 객체가 되고, 이 x에 100을 할당했기 때문에 결과값의 첫 줄에는 100이 출력됩니다.

     

    y에는 30이 들어가있지만, x++값을 할당해줍니다.

    x++는 x++가 들어가 있는 연산에서는 100이라는 이 반환될 것이고, 임의의 메모리 temp에는 101이 들어갑니다.

    x++가 100으로 반환되었으므로 y에는 100이 할당됩니다.

    그리고 y = x++; 연산이 끝나면 x에는 101이 할당되는 것이죠.

     

    따라서 두 번째 줄의 x값은 101, y값은 100이 출력됩니다.


    간단하지만 조금 디테일하게 다양한 예를 들어가며 설명해봤습니다.

    저도 이제 헷갈리지 않을 것 같아요.(아마도...?)

     

    도움이 많이 되셨길 바라며 다음 포스팅에서 뵙겠습니다!!

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기