자바의 연산자는 연산 결과의 특징에 따라 3가지로 나눌 수 있다. 첫째, 연산 결과가 특정 값이 나오는 산술
, 비트
, 시프트 연산자
둘째, 연산 결과가 참과 거짓 중 하나의 값으로만 나오는 비교
, 논리 연산자
마지막으로 값을 반환하는 것이 아닌 값을 대입하는 의미를 지니고 있는 대입 연산자
와 삼항 연산자
가 있다.
출처: https://m.blog.naver.com/29java/70188119123
산술 연산자는 사칙 연산(+, -, *, /)
과 나머지 연산(%)
이 있다. 이 중 정수 / 정수
형태의 나누기를 할 때 주의해야 하는데, int / int = int
이므로 5 / 2의 값은 2.5가 아니라 2 이다. 즉, 정수 / 정수
의 결과는 나눗셈의 몫
과 같다!
증감 연산자(++, --)는 변숫값을 1씩 증가 또는 감소 시킨다. 예를 들어 a++
의 의미는 a = a + 1
라는 뜻으로 현재 a의 값을 1 증가시켜 다시 변수 a에 저장하라는 의미이다.
증감연산자는 전위형
과 후위형
으로 나뉘는데 차이점은 실행의 우선순위
이다! 전위형은 모든 명령보다 먼저 실행되고 후위형은 가장 나중에 실행된다.
전위형, 후위형 증감 연산자가 동일한 결과를 출력할 때
int a = 3;
++a; // a 값에 1을 더하라는 명령 1개(전위형, 후위형 차이 x)
System.out.println(a); // 4
int b = 3;
b++; // b 값에 1을 더하라는 명령 1개(전위형, 후위형 차이 x)
System.out.println(b); // 4
전위형, 후위형 증감 연산자가 서로 다른 결과를 출력할 때
int a1 =3;
int b1 = ++a1;
System.out.println(a1); // 4
System.out.println(b1); // 4
int a2 = 3;
int b2 = a2++;
System.out.println(a2); //4
System.out.println(b2); //3
비트 단위의 연산자로, AND(&)
, OR(|)
, XOR(^)
, NOT(~)
이 있다.
비트 AND(&)는 두 값이 모두 1일 때만 1인 연산자, 비트 OR(|)은 두 값이 모두 0일 때만 0인 연산자이다. 비트 XOR(^)은 두 값이 같을 때 0, 다를 때 1의 값을 가지고 비트 NOT(~)은 0은 1, 1은 0으로 표현하는 연산자이다.
비트 단위의 연산을 직접 계산하기 위해서는 10진수를 비트 단위의 표현 방식인 2진수로 바꿔 표기할 수 있어야 한다.
자바는 코드상으로 10진수를 2진수, 8진수, 16진수로 변환하는 메서드와 이를 다시 10진수로 변환하는 메서드를 활용할 수 있다!
비트 AND 연산의 예
System.out.println(3 & 10); // 2
System.out.println(0b00000011 & 0b00001010); // 2
System.out.println(0x03 & 0x0A); // 2
비트 OR 연산의 예
System.out.println(3 | 10); // 11
System.out.println(0b00000011 | 0b00001010); // 11
System.out.println(0x03 | 0x0A); // 11
비트 XOR 연산의 예
System.out.println(3 ^ 10); // 9
System.out.println(0b00000011 ^ 0b00001010); // 9
System.out.println(0x03 ^ 0x0A); // 9
비트 NOT 연산자를 이해하기 위해서는 우선 양숫값
과 음숫값
을 읽는 방법을 알아야 한다. 값의 첫 번째 비트
는 부호 비트(0: 양수, 1: 음수)
로 숫자의 부호를 결정한다!
일단 부호가 결정되면 나머지 비트로 값을 읽으면 된다. 양수는 1을 기준으로 값을 읽고 음수는 0을 기준으로 값을 읽은 후 1을 더한 값이 음수의 절댓값이다.
NOT 연산자는 0과 1을 반전시키는 연산으로, 부호 비트까지 반전시키므로 비트 NOT 연산을 수행하면 항상 부호가 바뀌게 된다!
비트 NOT 연산의 예
System.out.println(~3); // -4
System.out.println(~0b00000011); // -4
System.out.println(~0x03); // -4
System.out.println(~0); // -1
System.out.println(~0b00000000); // -1
System.out.println(~0x00); // -1
비트의 위치를 좌우로 이동하는 연산으로 산술 시프트(<<, >>)
와 논리 시프트(>>>)
가 있다.
산술 시프트는 숫자의 부호 비트는 유지 하되 나머지 비트를 왼쪽(<<) 또는 오른쪽(>>)으로 이동하는 연산자이다.
x 2
의 효과가 있다.÷ 2
의 효과가 있다.논리 시프트는 숫자의 부호 비트를 포함해 전체 비트를 오른쪽으로 이동하시키는 연산으로, 빈칸은 모두 0으로 채운다. 부호 비트까지 이동시키므로 부호 비트가 1인 음수일 때는 논리 시프트 이후로 값이 양수로 변할 것이다.
논리 연산자는 비트 연산자와 비슷하지만, 피연산자로 오직 boolean 값만이 올 수 있다. 연산 결과 또한 boolean 타입만을 가진다. 논리 AND(&&)는 두 값이 모두 true일 때만 true이고, 나머지는 모두 false의 값을 가진다. 논리 OR(||)은 두 값이 모두 false 일때만 false이며, 나머지 경우는 모두 true이다. 논리 XOR(^)은 두 값이 다를 때는 true, 두 값이 같을 때는 false 의 연산결과를 나타나며, 논리 NOT(!)은 true와 false의 값을 반전시키는 연산자이다.
대입 연산자(=)는 오른쪽 피연산자의 연산 결과를 왼쪽 변수에 대입하는 연산자로, 수학에서 배운 등호(=)와 생김새는 똑같지만 의미하는 것이 전혀 다르므로 주의한다.
a = a+b
를 a+=b
로 축약해서 표현할 수 있다.자바 연산자 중 유일하게 3개의 피연산자가 있는 연산자이다.
삼항 연산자의 구성
(참 또는 거짓) ? 참일 때 연산 결과 : 거짓일 때 연산결과
삼항 연산자의 간단한 예
int a = (true) ? 1 : 2; //true 이므로 1 출력
System.out.println(a); // 1
int b = (a % 2 == 0) ? 10 : 20; //false이므로 20 출력
System.out.println(b); // 20
📕 참고문헌) Do it! 자바 완전 정복!