본문에 앞서 연산자와 피연산자에 대한 개념을 먼저 소개하자면 다음과 같다.
가장 기본적인 연산자로 사칙연산( + , - , * , / )과 나머지 연산(%)이 있다.
각각은 더하기(+) , 빼기(-) , 곱하기(*) , 나누기(/)를 의미한다.
정수/정수 형태의 나누기 연산은 나눗셈의 몫이 반환된다.
ex) 5/2 = 2
나머지 연산(%)은 나누기를 수행한 이후의 나머지를 반환한다.
모듈로(modulo)연산이라고도 한다.
int형 타입보다 범위가 작은 데이터 연산 시에는 int형으로 변환 후 연산을 수행한다.
int형 타입보다 범위가 큰 데이터가 있을 시에는 범위가 큰 타입의 결과가 반환된다.
증감 연산자(++,--)는 피연산자의 값을 1씩 증가 또는 감소시킨다.
증감 연산자는 실행의 우선순위에 따라 전위형과 후위형으로 나뉜다.
전위형 : 다른 모든 명령보다 먼저 연산이 실행됨
후위형 : 다른 모든 명령이 실행된 이후에 연산이 실행됨
int a1 = 5;
int b1 = ++a1; // a1의 값을 1만큼 증가시킨 후에 a1의 값을 b1에 대입
System.out.println(a1); // 6
System.out.println(b1); // 6
int a2 = 5;
int b2 = a2++; // a2의 값을 b2에 대입 후 a2의 값을 1만큼 증가시킴
System.out.println(a2); // 6
System.out.println(b2); // 5
비트 연산자란 비트 단위의 연산자로 AND(&), OR( | ), XOR(^), NOT(~)이 있다.
비트 연산자는 기능에 따라 비트 논리 연산자, 비트 이동 연산자로 나뉜다.
비트 연산자는 데이터를 비트 단위로 연산하기 때문에 0과 1로 표현이 가능한
정수 타입만 비트 연산이 가능하다.
일반 논리 연산자 에서는 true 와 false를 연산하지만 비트 논리 연산자에서는 0과 1을 연산한다.


산술 시프트는 숫자의 부호 비트는 유지하며 나머지 비트를 왼쪽(<<)또는
오른쪽(>>)으로 이동하는 연산자다.
x << y 연산
- 정수 x의 비트를 y만큼 왼쪽으로 이동시킨다.
- 부호 비트를 제외한 나머지 비트가 왼쪽으로 이동하며 ×2의 효과가 있다.
- 빈칸이 오른쪽에 생기며 0으로 빈칸을 채운다.
x >> y 연산
- 정수 x의 비트를 y만큼 오른쪽으로 이동시킨다.
- 부호 비트를 제외한 나머지 비트가 오른쪽으로 이동하며 ÷2의 효과가 있다.
- 빈칸이 왼쪽 부호 비트 다음에 생기며 빈칸은 부호 비트 값과 같은 값으로 채운다.
좌항과 우항을 비교하며 연산 결과로 boolean, 즉 true와 false중 하나를 나타낸다.
기본적인 크기 비교 연산은 우리가 아는것과 같다.
a > b : a가 b보다 크면 true, 아니면 false
a < b : a가 b보다 크면 true, 아니면 false
a >= b : a가 b보다 크거나 같으면 true, 아니면 false
a <= b : a가 b보다 크거나 같으면 true, 아니면 false
a == b : a와 b의 값이 같으면 true, 다르면 false
a != b : a와 b의 값이 다르면 true, 같으면 false
다만 여기서 중요한것은 등가 비교(== ,!=) 할때 비교 대상은 스택 메모리의 값을 비교한다.
기본 자료형일때는 실제 데이터값이 스택 메모리에 저장되지만
참조 자료형일때는 실제 데이터값은 힙 메모리에 저장되고 스택 메모리에는
실제 데이터값의 주소가 저장된다.따라서
기본 자료형일때는 실제 데이터값을 비교하고
참조 자료형일때는 실제 데이터의 주소값을 비교한다.
논리 연산자는 비트 연산자와 매우 유사하지만 논리 연산자는
boolean(true or false)값만 비교할 수 있으며 연산 결과도 모두 boolean타입이다.

대입 연산자( = ) : 오른쪽 피연산자의 연산 결과를 왼쪽 변수에 대입
대입 연산자는 다른 연산자와 결합해 축약된 형태로 사용될 수 있는데
예를 들어,
a = a + 5
a = a - 5
a = a / 5
와 같은 형태의 식을 살펴보면
모두 오른쪽의 연산 결과를 왼쪽 변수에 대입하라는 의미이며
좌항과 우항에 같은 변수가 존재하면
a += 5
a -= 5
a /= 5
이런 형태로도 표현이 가능하다.

자바 8부터 람다식(Lambda Expressions)을 지원하면서 람다식의 기본 문법으로 사용되는 연산자
화살표 연산자는 람다 파라미터와 람다 바디를 구분하는 역할을 한다.
(매개변수, ... ) -> { 실행문 ..} 와 같이 람다식을 주로 사용한다.
삼항 연산자는 if, else 구문으로 코드가 길어지는 단점을 해결하기 위한 만들어진 연산자이다.
형식은 다음과 같다.
(true 또는 false) ? 참일 때 연산 결과 : 거짓일 때 연산 결과
물음표(?) 앞에는 boolean 자료형만 올 수 있다.
boolean 자료형이 직접 올 수 있으나,
주로 연산 결과가 boolean인 논리 연산자와 비교 연산자가 위치한다.
int val1 = (10 > 7) ? 10 : 20
System.out.println(val1) // 10 출력
int val2 = (5 > 12) ? 10 : 20
System.out.println(val2) // 20 출력

https://velog.io/@1205kjw/3.2.6-%EB%8C%80%EC%9E%85-%EC%97%B0%EC%82%B0%EC%9E%90
https://math-coding.tistory.com/157
https://scshim.tistory.com/173
https://mine-it-record.tistory.com/120
https://devjun.tistory.com/65
Do it! 자바 완전 정복