> For the complete documentation index, see [llms.txt](https://nbcamp.gitbook.io/java-handbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nbcamp.gitbook.io/java-handbook/part-02..md).

# Part 02. 연산자

## 연산자와 피연산자 구별하기

> ## 9 \* x + 3

* 연산자 : 연산을 수행하는 기호 -> \* , +
* 피연산자 : 연산자의 연산 수행 대상 -> 9 ,  x , 3

> ## "모든 연산자는 <mark style="color:blue;">연산결과를 반환</mark>한다."
>
> * 즉, 연산결과를 반환하지 않으면 연산자가 아니다.
>   * ex) () -> <mark style="color:blue;">괄호는 연산자가 아니다.</mark>

## 연산자의 종류

|   종류   |                  연산자                  |                설명               |
| :----: | :-----------------------------------: | :-----------------------------: |
| 산술 연산자 |   +    -    \*    /    %    <<    >>  |         사칙 연산과 나머지 연산(%)        |
| 비교 연산자 |     <    >    >=    <=    ==    !=    |         크고 작음과 같고 다름을 비교        |
| 논리 연산자 | &&    \|\|    !    &    \|    ^    \~ | '그리고(AND)' 와 '또는(OR)' 으로 조건을 연결 |
| 대입 연산자 |                   =                   |          우변의 값을 좌변에 저장          |
| 기타 연산자 |      (type)     ?:     instanceof     |  형변환 연산자, 삼항 연산자, instanceof연산자 |

## 연산자의 우선순위

> ### 하나의 식에 연산자가 둘 이상 있을 때, 어떤 연산을 먼저 수행 할지를 자동 결정하는 것!
>
> #### = > 5 + 3 \* 4
>
> 1. 3 \* 4
> 2. 5 + 12&#x20;
>
> #### 연산 순서를 수동으로 결정하고 싶다면 <mark style="color:blue;">괄호()</mark> 를 사용하면 됩니다.
>
> #### = > (5 + 3) \* 4
>
> 1. 5 + 3
> 2. 8 \* 4

### 연산자 우선순위 표

| 우선순위 |     연산자    |                                    설명                                    |    결합 방향   |
| :--: | :--------: | :----------------------------------------------------------------------: | :--------: |
|   1  |     \[]    |                                  첨자 연산자                                  | 왼쪽에서 오른쪽으로 |
|      |      .     |                                  멤버 연산자                                  | 왼쪽에서 오른쪽으로 |
|   2  |     ++     |                                 후위 증가 연산자                                | 왼쪽에서 오른쪽으로 |
|      |     --     |                                 후위 감소 연산자                                | 왼쪽에서 오른쪽으로 |
|   3  |      !     |                                논리 NOT 연산자                                | 오른쪽에서 왼쪽으로 |
|      |     \~     |                                비트 NOT 연산자                                | 오른쪽에서 왼쪽으로 |
|      |      +     |                              양의 부호 (단항 연산자)                              | 오른쪽에서 왼쪽으로 |
|      |      -     |                              음의 부호 (단항 연산자)                              | 오른쪽에서 왼쪽으로 |
|      |     ++     |                                 전위 증가 연산자                                | 오른쪽에서 왼쪽으로 |
|      |     --     |                                 전위 감소 연산자                                | 오른쪽에서 왼쪽으로 |
|      |    (타입)    |                                타입 캐스트 연산자                                | 오른쪽에서 왼쪽으로 |
|   4  |     \*     |                                  곱셈 연산자                                  | 왼쪽에서 오른쪽으로 |
|      |      /     |                                  나눗셈 연산자                                 | 왼쪽에서 오른쪽으로 |
|      |      %     |                                  나머지 연산자                                 | 왼쪽에서 오른쪽으로 |
|   5  |      +     |                              덧셈 연산자 (이항 연산자)                             | 왼쪽에서 오른쪽으로 |
|      |      -     |                              뺄셈 연산자 (이항 연산자)                             | 왼쪽에서 오른쪽으로 |
|   6  |     <<     |                               비트 왼쪽 시프트 연산자                              | 왼쪽에서 오른쪽으로 |
|      |     >>     |                          부호 비트를 확장하면서 비트 오른쪽 시프트                         | 왼쪽에서 오른쪽으로 |
|      |     >>>    |                           부호 비트까지 모두 비트 오른쪽 시프트                          | 왼쪽에서 오른쪽으로 |
|   7  |      <     |                               관계 연산자(보다 작은)                              | 왼쪽에서 오른쪽으로 |
|      |     <=     |                             관계 연산자(보다 작거나 같은)                            | 왼쪽에서 오른쪽으로 |
|      |      >     |                               관계 연산자(보다 큰)                               | 왼쪽에서 오른쪽으로 |
|      |     >=     |                             관계 연산자(보다 크거나 같은)                            | 왼쪽에서 오른쪽으로 |
|      | instanceof |                              인스턴스의 실제 타입 반환                              | 왼쪽에서 오른쪽으로 |
|   8  |     ==     |                               관계 연산자(와 같은)                               | 왼쪽에서 오른쪽으로 |
|      |     !=     |                              관계 연산자(와 같지 않은)                             | 왼쪽에서 오른쪽으로 |
|   9  |      &     |                                비트 AND 연산자                                | 왼쪽에서 오른쪽으로 |
|  10  |      ^     |                                비트 XOR 연산자                                | 왼쪽에서 오른쪽으로 |
|  11  |     \|     |                                 비트 OR 연산자                                | 왼쪽에서 오른쪽으로 |
|  12  |     &&     |                                논리 AND 연산자                                | 왼쪽에서 오른쪽으로 |
|  13  |    \|\|    |                                 논리 OR 연산자                                | 왼쪽에서 오른쪽으로 |
|  14  |     ? :    |                                 삼항 조건 연산자                                | 오른쪽에서 왼쪽으로 |
|  15  |      =     | 대입 연산자 및 복합 대입 연산자 (=, +=, -=, \*=, /=, %=, <<=, >>=, >>>=, &=, ^=, \|=) | 오른쪽에서 왼쪽으로 |

### 우선순위 연습하기

<figure><img src="/files/Zybov8NKPGRuOmeTdBxq" alt=""><figcaption></figcaption></figure>

{% code lineNumbers="true" %}

```java
class Operator1_1 {
    public static void main(String[] args) {
        int x = 10;
        int y = 20;

        // + 연산자는 피연산자가 2개인 이항 연산자 임으로 단항 연산자인 -x 의 -가 먼저 실행된다.
        System.out.print("-x + 3 = ");
        System.out.println(-x + 3); // -10 + 3 = -7

        System.out.print("x + 3 * y = ");
        System.out.println(x + 3 * y); // 10 + (3 * 20) = 70

        System.out.print("x + 3 > y - 2 = ");
        System.out.println(x + 3 > y - 2); // false
        System.out.print("x + 3 < y - 2 = ");
        System.out.println(x + 3 < y - 2); // true

        System.out.print("x > 3 && y < 2 = ");
        System.out.println(x > 3 && y < 2); // false

        int result = x + y * 3;
        System.out.println("result = " + result); // 10 + (20 * 3), result = 70
    }
}
```

{% endcode %}

## 연산자의 결합규칙

> ### 우선순위가 같은 연산자가 있을 때, 어떤 것을 먼저?
>
> #### = > 3 + 4 - 5  -> (3 + 4) - 5
>
> * 기본적인 계산 순서는 왼쪽에서 오른쪽
> * <mark style="color:blue;">대입과 단항 연산자일 경우 오른쪽에서 왼쪽</mark>

## 3줄 요약

> ### 1. 산술 > 비교 > 논리 > 대입 : 대입은 제일 마지막에 수행됩니다.
>
> ### 2. 단항(1) > 이항(2) > 삼항(3) : 단항 연산자의 우선순위가 제일 높습니다.
>
> ### 3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽입니다.

{% hint style="info" %}
Ref. Java의 정석 기초편 Chapter3(1, 2, 3, 4)

Ref. [연산자와피연산자](https://www.youtube.com/watch?v=j5zmf0_suDE\&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp\&index=23), [우선순위와결합규칙](https://www.youtube.com/watch?v=sKs_dbia2fA\&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp\&index=24)
{% endhint %}
