증감(++, --) 연산자
증감 연산자는 단항 연산자로 피연산자의 값을 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 |
컴파일 단계에서 후위 연산자를 최적화 하였기에 전위 연산자와 차이가 없습니다. 하지만 증감 연산자를 풀어쓴 방식에서는 최적화가 되어었지 않아서 알고리즘이 더 복잡합니다. 데이터의 증감 처리를 위해서 임의의 상수를 임시로 할당하고 있으므로 연산 시간이 더 오래 걸릴 것으로 추측해볼 수 있습니다. 이러한 최적화 방식에 따라서는 개발 환경에 차이가 있을 수 있으니 직접 바이트 코드를 확인하는 것이 좋습니다.
'Java > Java SE, EE' 카테고리의 다른 글
[Java/Java SE, EE] 논리 연산자 (0) | 2022.01.11 |
---|---|
[Java/Java SE, EE] 부호(+, -) 연산자 (0) | 2022.01.10 |
[Java/Java SE, EE] 산술 연산자 (0) | 2022.01.10 |
[Java/Java SE, EE] 연산자(Operator)와 피연산자(Operand) (0) | 2022.01.10 |
박싱(Boxing)과 언박싱(Unboxing), 래퍼 클래스(Wrapper class) (0) | 2022.01.10 |