*연산자는 필요로 하는 피연산자의 수에 따라 단항, 이항, 삼항 연산자로 구분
*부호 연산자와 증감 연산자는 피연산자 하나만을 요구하므로 단항 연산자,
조건 연산자는 조건식, A, B와 같이 3개의 피연산자가 필요하므로 삼항 연산자.
그 외의 연산자는 2개의 피연산자를 요구하므로 모두 이항 연산자.
1. 부호 연산자(+, -)
양수 및 음수를 표시하는 +, -.
boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용할수있다.
+, -는 산술 연산자이기도 하고 부호 연산자이기도 하다. 부호 연산자로 쓰일 때는 하나의 피연산자만 요구한다.
+ : 피연산자의 부호 유지
- : 피연산자의 부호 변경int x = -100; int result1 = +x; int result2 = -x; -> result1은 -100 그대로 저장, result2는 변경된 양수 100이 저장됨.*부호 연산자의 결과는 int타입. 예를 들어 byte 타입 변수를 부호 연산하면 int 타입으로 변환된다.
byte b = 100; byte result = -b; // 컴파일 에러 발생, 만약 - 붙이지않고 b만 입력하면 에러 발생 x int result = -b; // 올바른 코딩
2. 증감 연산자(++, --)
변수의 값을 1 증가(++)시키거나 1 감소(--)시키는 연산자. boolean 타입을 제외한 모든 기본 타입의 피연산자에 사용할수있다.
++피연산자 : 다른 연산 수행하기 전에 피연산자의 값을 1 증가시킴
--피연산자 : 다른 연산 수행하기 전에 피연산자의 값을 1 감소시킴
피연산자++ : 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴
피연산자-- : 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴
3. 논리 부정 연산자(!)
true를 false로, false를 true로 변경하는 연산자. boolean 타입에만 사용할수있다.
!피연산자 : 피연산자가 true면 false 산출, false면 true 산출.
조건문, 제어문에서 조건식의 값을 부정하도록 해서 실행 흐름을 제어할때 주로 사용한다.
또한 두가지 상태(true/false)를 번갈아가며 변경하는 토글 기능을 구현할때도 사용한다.
4. 이항 연산자(산술, 문자열 결합, 비교, 논리, 대입)
피연산자가 2개인 연산자로 산술 연산자(+, -, , /, %), 문자열 결합 연산자(+), 비교 연산자(<, <=, >, >=, ==, !=), 논리 연산자(&&, ||, &, |, ^, !), 대입 연산자(=, +=, -=, =, /=, %=) 등이 있다.
1) 산술 연산자(+, -, *, /, %)
boolean 타입을 제외한 모든 기본 타입에 사용할수있다.
*long 타입을 제외한 정수 타입 연산은 int 타입으로 산출되고 피연산자 중 하나라도 실수 타입이면 실수 타입으로 산출된다.
ex 1) 피연산자들이 byte, short, char 타입일 경우, 모두 int 타입으로 변환된 후 연산 수행byte + byte -> int + int = intex 2) 피연산자들이 모두 정수 타입이고 long 타입이 포함되어있을 경우, 모두 long 타입으로 변환된 후 연산 수행
int + long -> long + long = longex 3) 피연산자 중 실수 타입(float, double)이 있을 경우, 허용 범위가 큰 실수 타입으로 변환된 후 연산 수행
int + double -> double + double = double2) 문자열 결합 연산자(+)
문자열을 서로 결합하는 연산자. + 연산자는 산술 연산자, 부호 연산자인 동시에 문자열 결합 연산자이기도 하다. 피연산자 중 한쪽이 문자열이면 + 연산자는 문자열 결합 연산자로 사용되어 다른 피연산자를 문자열로 변환하고 서로 결합한다.String str1 = "JDK" + 6.0; // "JDK6.0" 저장 String str2 = str1 + " 특징"; // "JDK6.0 특징" 저장 "JDK" + 3 + 3.0;; // "JDK33.0" 3 + 3.0 + "JDK"; // "6.0JDK"3) 비교 연산자(<, <=, >, >=, ==, !=)
피연산자의 대소(<, <=, >, >=) 또는 동등(==, !=)을 비교해서 true/false를(boolean 값을) 산출한다.
대소 연산자는 boolean을 제외한 기본 타입에 사용할수있고, 동등 연산자는 흐름 제어문인 조건문(if), 반복문(for, while)에서 주로 이용되어 실행 흐름을 제어할때 사용된다.
만약 피연산자가 char 타입이면 유니코드 값으로 비교 연산을 수행한다. 'A'의 유니코드는 65이고 'B'의 유니코드는 66이므로 비교 연산자는 65와 66을 비교한다.('A' < 'B') -> (65 < 66)비교 연산자에서도 연산을 수행하기 전에 피연산자의 타입을 일치시킨다. 아래와 같이 'A' == 65는 'A'가 int 타입으로 변환되어 65 == 65로 비교한다. 마찬가지로 3 == 3.0에서 3이 double 타입으로 변환되어 3.0 == 3.0으로 비교한다.
'A' == 65 -> 65 == 65 -> true 3 == 3.0 -> 3.0 == 3.0 -> true*한가지 예외가 있는데 0.1 == 0.1f 이다. 정상적이라면 0.1f가 왼쪽 피연산자와 같은 double 타입으로 변환되어 0.1 == 0.1이 되고 true가 산출돼야하지만 false가 산출된다.
0.1 == 0.1f -> false이유는 실수의 저장 방식인 부동 소수점 방식이 0.1을 정확히 표현할수없기때문이다. 0.1f는 0.1의 근사값으로 표현되는데 0.1보다 큰 값이기에 false로 산출된다.
해결책은 피연산자를 모두 float 타입으로 변환해서 비교하거나 정수 타입으로 변환해서 비교하는것이다.double v1 = 0.1; float v2 = 0.1f; System.out.println((float) v1 == v2); // true*String 문자열을 비교할때는 대소 비교 연산자(<, <=, >, >=)를 사용할수없고 동등 비교 연산자(==, !=)는 사용할수있으나 문자열이 같은지, 다른지를 비교하는 용도로는 사용되지 않는다.
기본 타입(byte, char, short, int, long, float, double, boolean) 변수의 값을 비교할때는 == 연산자를 사용하지만 참조 타입인 String 변수를 비교할때는 equals( ) 메서드를 사용한다.String strVar1 = "태극기"; String strVar2 = "태극기"; System.out.println(strVar1.equals(strVar2)); // true System.out.println(!strVar1.equals(strVar2)); // false4) 논리 연산자(&&, ||, &, |, ^, !)
논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^), 논리 부정(!) 연산을 수행한다.
논리 연산자의 피연산자는 boolean 타입만 사용할수있다.(boolean 값 산출)
&&와 &, ||와 | 모두 두개짜리가 더 효율적으로 동작한다. &는 두 피연산자 모두를 평가해서 산출 결과를 내지만 &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지않고 바로 false라는 산출결과를 내기 때문이다. ||도 마찬가지이다.
5) 대입 연산자(=, +=, -=, *=, /=, %=)
대입 연산자는 오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장한다. 오른쪽 피연산자에는 리터럴 및 변수, 다른 연산식이 올수있다. 단순히 오른쪽 피연산자의 값을 변수에 저장하는 단순 대입 연산자가 있고 정해진 연산을 수행 후 결과를 변수에 저장하는 복합 대입 연산자도 있다.
*대입 연산자는 모든 연산자들 중에서 가장 낮은 연산 순위를 가지고있기 때문에 제일 마지막에 수행된다.
그리고 연산의 진행 방향이 오른쪽에서 왼쪽이기 때문에 아래와 같은 순서로 연산된다.
a = b = c = 5
-> c = 5, b = c, a = b 순으로 연산된다.

5. 삼항 연산자(?:)
삼항 연산자는(?:)는 3개의 피연산자를 필요로 하는 연산자를 말한다. 삼항 연산자는 ? 앞의 조건식에 따라 콜론(:) 앞뒤의 피연산자가 선택된다고 해서 조건 연산식이라고 부르기도 한다.
(조건식) ? A : B // 조건식이 true면 A 산출, false면 B 산출.
int score = 95; char grade = (score > 90) ? 'A' : 'B'; // grade에는 'A'가 저장된다. if/else문으로 작성해도 된다.