[흥]증감 연산자에 대한 오류 수정

심채원·2023년 9월 12일
0

-deprecated-

목록 보기
2/11

증감 연산자는 프로그래밍 언어를 처음 배웠을 때 매우 헷갈렸던 기억이 아직 강렬하다.
여러번 실행의 예측 과정을 여러번 반복하고 나서, 어느덧 내가 모든 증감 연산자의 실행 결과를 다 맞히던 때에... 증감 연산자는 껌이지!라고 생각했던 나를 반성하며 이 글을 쓴다...

역시 배움에는 끝이 없다... 아는 것도 다시 한 번!

우선 증감 연산자에 대해 정리해보자.

  1. 변수의 값을 1 증가 혹은 1 감소하는 역할을 한다.

  2. 정수 타입의 피연산자에 사용이 가능하다.

  3. 위치에 따라 [전위/후위 증감 연산자]로 구분되며 각각의 작동 방식에 차이가 있다.
    3-1. 단독으로 사용될 경우에는 전위 연산자나 후위 연산자의 실행이 동일하다.
    3-2. 다른 연산자들과 함께 사용되는 경우에 우선순위에 변화가 있다.

    • 전위 연산자 : 다른 연산을 수행하기 전 해당 피연산자의 값을 1 증가/감소시킴.
    • 후위 연산자 : 다른 연산을 모두 수행하고 난 후, 해당 피연산자의 값을 1 증가/감소 시킨다.

증감 연산자에 대한 간략한 설명은 위와 같다.

증감 연산자는 대표적인 단항 연산자로, 1을 더하거나 빼는 수행을 하고 위치에 따라 실행 순서가 달라진다.

3-1의 설명대로, 단독으로 사용될 경우에는 전위 연산과 후위 연산의 실행 차이는 없다.

let x = 1;
let y = 1;

x++;
++y;
console.log(x); // 2 출력
console.log(y); // 2 출력

하지만, 다른 연산과 함께 사용된 경우에는, 3-2의 설명처럼 연산자들 간의 우선순위에 변화가 생긴다.

  • 다른 연산자들과 혼용한 경우
int x = 1;
int y = 1;

int result = ++x + 10; // (1)
int result2 = y++ + 10; // (2)

(1) x값 1 증가 후 x+10 실행 => 12
(2) y+10 연산 이후 y의 값 1 증가 => 11

: 각 코드의 실행 순서를 위에 명시한 것과 같이
  증감 연산자의 위치에 따라 + 덧셈 연산과 해당 증감 연산자의 실행 순서가 결정된다.

(1)에서는 전위 연산자가 사용되었고, 덧셈연산보다 우선 실행된다.
반면 (2)에서는 후위 연산자가 사용되었고, 덧셈 연산이 실행된 이후 1이 증가하였다.

(오류)
!
! 현재까지 증감 연산자의 우선순위가 `해당 줄의 모든 연산자`를 앞선다고 생각했고, 아직까지 증감 연산을 사용할 때 문제가 발생한 적이 없다.

하지만 실제 동작하는 과정은 내 생각과 매우 달랐고, 그렇기에 이에 대해 정리하고자 한다.
다음 예시의 코드는 증감 연산을 이해하기 위한 코드이고, 실제 프로그래밍 과정에서 사용하지 않는 것이 좋다.

💡 다음의 실행 결과를 예상해보자.
int n = 1;
int result = n++ + 10 + ++n;

System.out.println("result : " + result);
System.out.println("n : " + n);
  • result : 4 n : 3

  • 내가 알고 있던 연산 과정

    • 이제껏 해당 코드에서 우선적으로 연산되는지 알고 있었음
    • 전위 증가 연산자가 먼저 실행되면서 n 은 2가 되고, result가 계산된다. (2 + 10 + 2)
    • result에 대입된 이후, 후위 증가 연산이 실행되며 n이 1 증가한다
  • 실제 연산 과정
    - 1) n++ + 10 : n과 10이 우선 더해진다. → 11
    - 2) n이 1 증가한다. → n = 2;
    - 3) 11 + ++n : n이 우선 1 증가된다. → n = 3;
    - 4) 11 + n이 연산된다.
    - 결과적으로 result에는 14가 할당된다.

    내가 갖고 있는 지식이 맞다고 생각해서(결과는 동일하게 나왔거든!) 처음 위의 코드와 설명을 들었을 때는 엥???? 뭐지???? 라고만 생각하다가, 몇 가지 코드 실행 후에 나의 오류를 인정할 수 있었다...

    int a = 1;
    int result = a + 10 + ++a;
    System.out.println(result);
    
  • 내 생각대로라면 위의 result 값도 위의 코드와 동일하게 14가 출력되어야 한다.

  • 하지만 실제 코드를 실행해보면 result의 값은 13이 나온다.

  • 이렇게까지 했음에도 1여년을 지녀 온 나의 지식의 오류를 인정할 수 없어 자바스크립트는 좀 다른가?라며 N개월만에 개발자 도구를 열어 자바스크립트로 또 실행해봤다.

이 때서야 인정할 수 밖에 없었다..

코드 한줄의 모든 연산에서 우선되는 것이 아니라 증감 연산자의 피연산자가 속한 연산보다 우선 실행되는 것이다!!


위의 코드 예시는 이론적인 이해를 위해 사용된 코드고 실제 코드에서는 절대로 사용하지 말자!

지금까지 본 글들에서 세세하게 설명되어 있는 글을 찾지 못했고, 내부 수행 과정까지 필요하지 않아 해당 코드 줄이 실행되기 전, 후로 설명을 하셨던 것 같다.

지금까지도 내가 아는 대로 사용을 했다고 해서 오류가 발생한 적이 없으니 내 머리에는 그대로 저장되어 있었고 오늘에서야 이에 대한 제대로된 이해를 하게 되어 블로그를 작성해 보았다.

꼼꼼히 봐야지...!!

profile
인생의 디테일을 추가하는 심채원

0개의 댓글