증감 연산자 (선행 연산자 & 후행 연산자)
▶▶ 증감연산자 ( ++ -- )
– 단항연산자
– 수치데이터타입의 피연산자의 앞(좌측) 또는 뒤(우측)에 붙어, 해당 피연산자의 값을 1만큼 증가 또는 감소 시킴.
– 다른 연산과 결합하여 사용될 때 위치에 따라 결과가 다름.
▶ 선행연산자 (전위연산자)
– 피연산자 앞(좌측)에 위치하여 값을 1만큼 증가 또는 감소시킴.
이 때, 다른 연산과 결합하여 사용하는 경우, 먼저 피연산자의 값을 1 증가 또는 감소한 후 다른 연산에 참여함.
ex ) ++a, --a
▶ 후행연산자 (후위연산자)
– 피연산자 뒤(우측)에 위치하여 값을 1만큼 증가 또는 감소시킴.
이 때, 다른 연산과 결합하여 사용하는 경우, 먼저 다른 연산에 참여시킨 후 피연산자의 값을 1 증가 또는 감소시킴.
ex ) a++, a--
EX1 ) 정수 a의 값을 1만큼 증가시키는 방법
byte a = 10;
→ byte타입의 변수 선언함.
1 ) 일반적인 산술연산자와 대입연산자 사용
a = a+1; // 오류 발생!
→ 컴파일 에러 발생 (byte + int = int 저장 불가)
a = (byte)(a+1);
→ int타입을 byte타입으로 강제 형변환 함.
2 ) 확장 대입연산자 사용
a += 1;
→ 형변환 불필요 (연산 과정에서 자동 형변환 일어나지 않음)
3 ) 증감연산자 사용
a++;
→ 형변환 불필요 (연산 과정에서 자동 형변환 일어나지 않음)
EX2 ) 선행연산자 & 후행연산자 사용
int b = 5;
b++;
System.out.println(b);
→ 변수b의 값을 1만큼 증가시킴, 5에서 6으로 증가
✓ b = 6
++b;
System.out.println(b);
→ 변수b의 값을 1만큼 증가시킴, 6에서 7로 증가
✓ b = 7
b--;
System.out.println(b);
→ 변수b의 값을 1만큼 감소시킴, 7에서 6으로 감소
✓ b = 6
--b;
System.out.println(b);
→ 변수b의 값을 1만큼 감소시킴, 6에서5로 감소
✓ b = 5
EX3 ) 증감연산자 위치에 따른 연산 과정의 차이
int x1 = 5;
int y1 = ++x1; // 선행연산자
→ 변수x1의 값을 먼저 1만큼 증가시킨 후, 대입연산자를 통해 x1값을 y1에 대입 (저장)
→ x1의 값이 5에서 6으로 증가된 후, y1에 증가된 값 6이 저장됨.
✓ x1 = 6, y1 = 6
int x2 = 5;
int y2 = x2++; // 후행연산자
→ 변수x2의 값을 먼저 y2에 대입한 후, 증감연산자를 통해 y2값을 1만큼 증가시킴.
→ x2의 값이 y2에 저장된 후, x2의 값이 5에서 6으로 증가
✓ x2 = 6, y2 = 5
EX4 ) 대입연산자와 결합 대신 출력문에서 사용 가능
x2 = 5;
System.out.println(++x2);
→ 출력문에 x2값을 전달하기 전에 먼저 증감연산자가 사용됨.
✓ x2의 값을 먼저 +1 증가시킨 후 '6'이 출력됨.
System.out.println(x2++);
→ x2의 값을 먼저 출력한 후, +1 증가시킴.
✓ '6'이 출력됨.
System.out.println(x2);
→ 위의 과정에서 6이 출력된 후 +1 증가시켜 6에서 7이 됨.
✓ '7'이 출력됨.
EX5 ) char타입에 증감연산자 사용하기
char ch = 'A'; // 문자 'A'는 65의 정수값을 가짐.
System.out.println(ch + 1);
→ ch+1 == (char)+(int)=int == 65+1 == 66
✓ 결과값 66이 출력됨.
ch를 출력해보면,
System.out.println(ch);
→ ch값을 직접 변경하지 않았으므로 ch변수에는 여전히 'A'가 들어있음.
후행연산자 사용으로 ch값 직접 변경해보기!
System.out.println(ch++);
→ 출력 먼저 하고, +1 증가시킨 뒤 ch변수에 저장함.
System.out.println(ch);
✓ 위의 과정에서 +1 증가된 값이 적용되었으므로 'B'가 출력됨.
System.out.println(++ch);
System.out.println(ch);
✓ ch값을 먼저 +1, 그 다음이 출력이므로 'C'가 나옴.
✓ ch변수에도 C가 저장되어 출력됨.
EX6 )
int x = 10;
int y = 20;
int z = ++x + y--;
System.out.println(x); // 11
System.out.println(y); // 19
System.out.println(z); // 31
→ 첫 번째 출력문 : 변수 z에 ++x가 선행연산자로 쓰여서 x는 먼저 +1 증가된 뒤에 출력됨.
✓ x = 11
→ 두 번째 출력문 : 변수 z에 y--가 후행연산자로 쓰여서 y는 변수 z의 연산에 먼저 참여한 뒤, -1 감소됨.
✓ y = 19
→ 세 번째 출력문 : 변수 z에는 선행연산자로 이미 +1 증가한 x값(11), 후행연산자로 아직 -1되지 않은 y값(20)이 존재함.
✓ z = 31
Comment

선행연산자 후행연산자 이해했다가도 다시 보면 헷갈리고 난리다ㅎ
계속해서 예제 찾아보고 문제 풀어보고 했더니
어느덧 으쓱한 새벽이네ㅠㅠㅠ
머릿속에서 +기호와 -기호가 정처없이 떠도는 이 새벽...
나중에 현란하게 쓰일 때를 대비해서 조금만 더 보고 자야겠다!