증감 연산자는 프로그래밍 언어를 처음 배웠을 때 매우 헷갈렸던 기억이 아직 강렬하다.
여러번 실행의 예측 과정을 여러번 반복하고 나서, 어느덧 내가 모든 증감 연산자의 실행 결과를 다 맞히던 때에... 증감 연산자는 껌이지!라고 생각했던 나를 반성하며 이 글을 쓴다...
우선 증감 연산자에 대해 정리해보자.
변수의 값을 1 증가 혹은 1 감소하는 역할을 한다.
정수 타입의 피연산자에 사용이 가능하다.
위치에 따라 [전위/후위 증감 연산자]로 구분되며 각각의 작동 방식에 차이가 있다.
3-1. 단독으로 사용될 경우에는 전위 연산자나 후위 연산자의 실행이 동일하다.
3-2. 다른 연산자들과 함께 사용되는 경우에 우선순위에 변화가 있다.
증감 연산자에 대한 간략한 설명은 위와 같다.
증감 연산자는 대표적인 단항 연산자로, 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
내가 알고 있던 연산 과정
(2 + 10 + 2)
실제 연산 과정
- 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개월만에 개발자 도구를 열어 자바스크립트로 또 실행해봤다.
이 때서야 인정할 수 밖에 없었다..
코드 한줄의 모든 연산에서 우선되는 것이 아니라 증감 연산자의 피연산자가 속한 연산보다 우선 실행되는 것이다!!
위의 코드 예시는 이론적인 이해를 위해 사용된 코드고 실제 코드에서는 절대로 사용하지 말자!
지금까지 본 글들에서 세세하게 설명되어 있는 글을 찾지 못했고, 내부 수행 과정까지 필요하지 않아 해당 코드 줄이 실행되기 전, 후로 설명을 하셨던 것 같다.
지금까지도 내가 아는 대로 사용을 했다고 해서 오류가 발생한 적이 없으니 내 머리에는 그대로 저장되어 있었고 오늘에서야 이에 대한 제대로된 이해를 하게 되어 블로그를 작성해 보았다.
꼼꼼히 봐야지...!!