. Java의 정석

[Java] 증감 연산자

박인영 2021. 7. 6. 21:51



<증감 연산자>


단항 연산자 중 증감 연산자는
피연산자에 저장된 값을 1 증가 또는 감소시킨다.

int i = 5;
System.out.println(++i);	// 6
System.out.println(--i);	// 4


대입 연산자와 마찬가지로 피연산자의 값을 변경하기 때문에
증감 연산자의 피연산자로
정수와 실수가 모두 가능하지만,
상수는 값을 변경할 수 없으므로 불가능하다.

증감 연산자는 일반 산술 변환에 의해 자동 형변환이 발생하지 않으며,
연산 결과의 타입은 피연산자의 타입과 같다.


<증감 연산자의 타입>


일반적으로 단항 연산자는
-3처럼 피연산자의 왼쪽에 위치하지만,
증감 연산자는 양쪽 모두 가능하다.

++i 와 같이 피연산자의 왼쪽에 위치하면 '전위형(prefix)',
i++ 과 같이 피연산의 오른쪽에 위치하면 '후위형(postfix)'이라고 한다.

증감 연산자가 독립적인 하나의 문장으로 쓰인 경우에는
전위형과 후위형의 차이는 없다.

int a = 5;
System.out.println(++a);	// 6
System.out.println(a++);	// 6




하지만 증감 연산자가 수식 등이 포함되어 독립적으로 쓰이지 않을 때는
++i 전위형과 i++ 후위형일 때 결과가 다르다.
전위형은 값이 참조되기 전에 증가시며,
후위형은 값이 참조된 후에 증가시킨다.


int a = 5;
int b = ++a;
System.out.println(a);	// 6
System.out.println(b);	// 6

위와 같은 전위형 연산의 경우,
b = ++a; 로 인하여
a 변수에 저장되어 있던 5가 1 증가되어 6으로 a 변수에 저장되고
그 값이 b에도 저장되었다.
(++a; 증가가 되고 b = a; 참조하여 대입되었다.)


int a = 5;
int b = a++;
System.out.println(a);	// 6
System.out.println(b);	// 5

위와 같은 후위형 연산의 경우,
b = a++; 로 인하여
a 변수에 저장되어 있던 5가
b 변수에 저장되고 난 후에 1 증가되어
a 변수에는 6이 저장되었다.
(b = a; 참조하여 대입되고 ++a; 증가되었다.)



어렵다.
수학에서 배우지 않은 연산법이기 때문에
증감 연산자를 이용한 많은 연습이 필요하다.


int a = 5 , b = 5;
System.out.println(a++);		// 5	--- ①②
System.out.println(++b);		// 6	--- ③④
System.out.println(a);		// 6	--- ⑤
System.out.println(b);		// 6	--- ⑥

① System.out.println(a); // a 변수는 저장되어 있던 5를 println()에 넘겨준다.
a++; // a 변수에는 저장되어 있던 5가 1 증가되어 6을 저장한다.
③ ++b; // b 변수에 저장되어 있는 5가 1 증가되어 6을 저장한다.
④ System.out.println(b); b 변수는 ③ 과정에서 저장된 6을 println()에 넘겨준다.
⑤ a 변수에 ② 과정에서 저장된 6을 println()에 넘겨준다.



증감 연산자를 사용하면 코드가 간결해지지만,
지나치면 코드가 복잡해서 이해하기 어려워지기도 한다.


int x = 5;
x = x++ - ++x;
System.out.println(x);

x++; x 변수에 저장되어 있던 5가 - 연산자에 참조된 후 1 증가되어 6을 저장한다.
② ++x ; x 변수에 ① 과정에서 저장된 6이 1 증가되어 7을 저장한 후 - 연산자에 참조된다.
③ x = 5 - 7; 의 결과 값이 println();에 의해 -2를 출력한다.