본문 바로가기

Java/Java SE, EE

[Java/Java SE, EE] 증감(++, --) 연산자

증감(++, --) 연산자

증감 연산자는 단항 연산자로 피연산자의 값을 1만큼 증감(++ 또는 --)합니다. 따라서 연산식 i++ 또는 ++i를 풀어쓰면 i = i + 1이 됩니다. 

구분 연산자 항의 개수 연산식 결과
증감 ++ 또는 -- 단항 피연산자를 1만큼 증가 또는 1만큼 감소

전위 증감 연산자, 후위 증감 연산자

증감 연산자는 연산자가 피연산자의 왼쪽(++i) 또는 오른쪽(i++) 어느 위치에 존재하는지에 따라서 실행 결과가 달라집니다. 연산자가 피연산자의 왼쪽에 위치한 경우 전위 연산자, 오른쪽에 위치하는 경우 후위 연산자라고 부릅니다. 따라서 전위 증감 연산자는 ++i 또는 --i,  후위 증감 연산자는 i++ 또는 i--를 의미합니다.

int a = 10;

System.out.println(++a);	// 11
System.out.println(a);		// 11

System.out.println(a++);	// 11
System.out.println(a);		// 12

전위 증감 연산자의 경우 증감 연산이 먼저 수행 된 뒤 다음 연산을 진행합니다. 따라서 예시에서 ++a의 결과는 11입니다. 

반대로 증후위 증감 연산자의 경우 다음 연산을 먼저 진행 후 증감 연산을 수행합니다. 따라서 예시에서 a++의 결과는 여전히 11이고, 다음 행에서 다시 출력했을 때 값이 1 증가한 것을 확인 할 수 있습니다.

증감 연산자에 따른 성능 차이

자바에서 전위 증감 연산자와 후위 증감 연산자, 그리고 a = a + 1와 같이 증감 연산자를 풀어쓴 경우 컴파일 환경에 따라서 성능 차이가 발생합니다. 아래는 제 개발 환경에서 각 연산식 별 바이트 코드 결과를 상호 비교한 것입니다. 

구분 소스 코드 바이트 코드 알고리즘
전위 연산자(++a) int a = 10;
++a;
BIPUSH 10
ISTORE 0
IINC 0 1
a = 10
a = a + 1
후위 연산자(a++) int a = 10;
a++;
BIPUSH 10
ISTORE 0
IINC 0 1
a = 10
a = a + 1
a = a + 1 int a = 10;
a = a + 1
BIPUSH 10
ISTORE 0
ILOAD 0
ICONST_1

IADD
ISTORE 0
a = 10
const b = a
a = b + 1

컴파일 단계에서 후위 연산자를 최적화 하였기에 전위 연산자와 차이가 없습니다. 하지만 증감 연산자를 풀어쓴 방식에서는 최적화가 되어었지 않아서 알고리즘이 더 복잡합니다. 데이터의 증감 처리를 위해서 임의의 상수를 임시로 할당하고 있으므로 연산 시간이 더 오래 걸릴 것으로 추측해볼 수 있습니다. 이러한 최적화 방식에 따라서는 개발 환경에 차이가 있을 수 있으니 직접 바이트 코드를 확인하는 것이 좋습니다.