# 연산자

| 종류  | 연산자                                                       | 피연산자 수 | 산출값         | 기능설명                   |
| --- | --------------------------------------------------------- | ------ | ----------- | ---------------------- |
| 산술  | `+`,`-`,`*`,`/`,`%`                                       | 이항     | 숫자          | 사칙연산 및 나머지 계산          |
| 부호  | `+`,`-`                                                   | 단항     | 숫자          | 음수, 양수의 부호             |
| 문자열 | `+`                                                       | 이항     | 문자열         | 두 문자열을 연결              |
| 대입  | `=`,`+=`,`-=`,`*=`,`/=`,`%=`,`&=`,`^=`,`<<=`,`>>=`,`>>>=` | 이항     | 다양          | 우변의 값을 좌변의 변수에 대입      |
| 증감  | `++`,`--`                                                 | 단항     | 숫자          | 1만큼 증가/감소              |
| 비교  | `==`,`!=`,`>`,`<`,`>=`,`<=`,`instanceof`                  | 이항     | boolean     | 값의 비교                  |
| 논리  | `!`,`│`,`&`,`&&`,`││`                                     | 단항,이항  | boolean     | 논리적 NOT, OR, AND연산     |
| 조건  | `(조건식)?A:B`                                               | 삼항     | 다양          | 조건식에 따라 A 또는 B 중 하나 선택 |
| 비트  | `~`,`&`,`│`,`^`                                           | 단항, 이항 | 숫자, boolean | 비트 NOT, OR, AND, XOR   |
| 쉬프트 | `>>`,`<<`,`>>>`                                           | 이항     | 숫자          | 비트를 좌측/우측으로 밀어서 이동     |

| 연산자                                                           | 방향 |
| ------------------------------------------------------------- | -- |
| 증감(`++`,`--`),부호(`+`,`-`),비트(`~`),논리(`!`)                     | ←  |
| 산술(`*`,`/`,`%`)                                               | →  |
| 산술(`+`,`-`)                                                   | →  |
| 쉬프트(`>>`,`<<`,`>>>`)                                          | →  |
| 비교(`>`,`<`,`>=`,`<=`,`instanceof`)                            | →  |
| 비교(`==`,`!=`)                                                 | →  |
| 논리(`&`)                                                       | →  |
| 논리(`^`)                                                       | →  |
| 논리(`│`)                                                       | →  |
| 논리(`&&`)                                                      | →  |
| 논리(`││`)                                                      | →  |
| 조건(`?:`)                                                      | →  |
| 대입(`=`,`+=`,`-=`,`*=`,`/=`,`%=`,`&=`,`^=`,`<<=`,`>>=`,`>>>=`) | ←  |

```
1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.
2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
3. 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.
4. 복잡한 연산식에는 괄호()를 사용해서 우선순위를 정해준다.
```

\-- **비트반전연산자, 부호연산자는 `int`타입이 된다.** --

```java
String BinaryString = Integer.toBinaryString(10); // 정수 값을 32비트 이진 문자열로 반환
```

```
산술 연산시에 오버플로우가 발생하지 않도록 주의해아한다.

나눗셈(/)과 나머지(%)연산에서 우측 피연산자는 0을 사용할 수 없다.(ArithmeticException 예외 발생)
하지만 0.0 or 0.0f으로 계산할 경우에는
	나눗셈(/) 연산은 Infinity(무한대) 결과 값
	나머지(%) 연산은 NaN(Not a Number) 결과 값을 가진다.
```

```java
Double.isInfinite(); // 결과 값이 Infinite인지 확인
Double.isNaN(); 	 // 결과 값이 NaN인지 확인
```

```
NaN은 != 연산자를 제외한 모든 비교 연산자를 사용할 경우 false값을 반환한다.
그러므로 반드시 Double.isNaN() 메소드를 사용해야한다.
```

String 객체의 문자열만을 비교하고 싶다면 `==`대신에 `equals()`메소드를 사용해야햔다.

```java
boolean result = str1.equals(str2);
```
