본문 바로가기
카테고리 없음

[step-3] Java - Operator

by smhan 2021. 1. 21.

목표

자바가 제공하는 다양한 연산자를 학습하세요.

학습할 것

산술 연산자

비트 연산자

관계 연산자

논리 연산자

instanceof

assignment(=) operator

화살표(->) 연산자

3항 연산자

연산자 우선 순위

(optional) Java 13. switch 연산자

마감일시

2020년 11월 28일 오후 3시까지





산술 연산자


정의

사칙연산을 다루는 연산자이며 모두 두 개의 피연산자를 가지는 이항 연산자이고, 결합 방향은 왼쪽 -> 오른쪽이다.


종류

+    왼쪽의 피연산자에 오른쪽의 피연산자를 더함.

-    왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌

*    왼쪽의 피연산자에 오른쪽의 피연산자를 곱함.

/    왼쪽의 피연산자를 오른쪽의 피연산자로 나눔.

%    왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함.

예제


int number1 = 12, number = 3;

System.out.println("+ 연산자에 의한 결과 : "+ (num1 + num2));
    실행결과 : 15

System.out.println("- 연산자에 의한 결과 : "+ (num1 - num2));
    실행결과 : 9

System.out.println("* 연산자에 의한 결과 : "+ (num1 * num2));
    실행결과 : 36

System.out.println("/ 연산자에 의한 결과 : "+ (num1 / num2));
    실행결과 : 4

System.out.println("% 연산자에 의한 결과 : "+ (num1 % num2));
    실행결과 : 0

비트 연산자


정의

비트(bit) 단위로 논리 연산을 할때 사용하는 연산

비트(bit) 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동하거나, 1의 보수를 만들 때도 사용

종류

&    대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)

|    대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)

^    대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)

~    비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산, 1의 보수)

<<    명시된 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산)

>>    부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)

>>>    지정한 수만큼 비트를 전부 오른쪽으로 이동시키며, 새로운 비트는 전부 0이 됨.

비트 연산자 동작 나열

비트 AND 연산

대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환

Image

비트 OR 연산

대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환

Image

비트 XOR 연산

대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환

Image

비트 NOT 연산

해당 비트가 1이면 0을 반환하고, 0이면 1을 반환

Image


예제코드

int num1 = 8, num2 = -8;

System.out.println("~ 연산자에 의한 결과 : "+ ~num1);

// 실행결과 :  -9

해설

  • 비트 반전 연산자(~)는 피연산자의 1의 보수를 반환하므로, 피연산자의 부호만 반대로 변경


System.out.println("<< 연산자에 의한 결과 : "+ (num1 << 2));

// 실행결과 : 32

해설
Image




System.out.println(">> 연산자에 의한 결과 : "+ (num2 >> 2));

// 실행결과 : -2

해설
Image




System.out.println(">>> 연산자에 의한 결과 : "+ (num1 >>> 2));

// 실행결과 : 2

해설
Image




System.out.println(">>> 연산자에 의한 결과 : "+ (num2 >>> 2));

// 실행결과 : 1073741822

해설
Image


관계 연산자


정의

피연산자 사이의 상대적인 크기를 판단하는 연산자

왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단

모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽

종류

==    왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참을 반환함.

!=    왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환함.

>    왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 참을 반환함.

>=    왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 참을 반환함.

<    왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 참을 반환함.

<=    왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 참을 반환함.

예제코드

char ch1 = 'a', ch2 = 'A';

System.out.println("== 연산자에 의한 결과 : "+ (ch1 == ch2));

// 실행결과 : false

System.out.println("> 연산자에 의한 결과 : "+ (ch1 > ch2));

// 실행결과 : true

논리 연산자


정의

주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자입니다.AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽

NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽

종류

&&    논리식이 모두 참이면 참을 반환함. (논리 AND 연산)

||    논리식 중에서 하나라도 참이면 참을 반환함. (논리 OR 연산)

!    논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (논리 NOT 연산)

예제코드

char ch1 = 'b', ch2 = 'B';

boolean result1, result2

result1 = (ch1 > 'a') && (ch1 < 'z');
result2 = (ch2 < 'A') || (ch2 < 'Z');

System.out.println("&& 연산자에 의한 결과 : "+ result1);
// 실행결과 : true

System.out.println("|| 연산자에 의한 결과 : "+ result2);
// 실행결과 : true

System.out.println("! 연산자에 의한 결과 : "+ !result2);
// 실행결과 : false

논리연산자 모든 동작에 대한 진리표

 A   B  A && B  A || B  ! A
true true true true false
true false false true false
false true false true true
false false false false true

모든 연산자 우선순위


순위
    1) 
        []    첨자 연산자    왼쪽 -> 오른쪽
         .    멤버 연산자    왼쪽 -> 오른쪽

    2) 
        ++    후위 증가 연산자    왼쪽 -> 오른쪽
        --     후위 감소 연산자     왼쪽 -> 오른쪽

     3)    
        !        논리 NOT 연산자            오른쪽 -> 왼쪽
         ~        비트 NOT 연산자            오른쪽 -> 왼쪽
         +        양의 부호 (단항 연산자)      오른쪽 -> 왼쪽
         -        음의 부호 (단항 연산자)      오른쪽 -> 왼쪽
         ++        전위 증가 연산자           오른쪽 -> 왼쪽
         --        전위 감소 연산자           오른쪽 -> 왼쪽
         (타입)   타입 캐스트 연산자          오른쪽 -> 왼쪽

    4)
        *        곱셈 연산자        왼쪽 -> 오른쪽
        /        나눗셈 연산자        왼쪽 -> 오른쪽
         %        나머지 연산자        왼쪽 -> 오른쪽

    5)    

        +        덧셈 연산자 (이항 연산자)    왼쪽 -> 오른쪽
        -        뺄셈 연산자 (이항 연산자)    왼왼쪽 -> 오른쪽

    6)    
        <<        비트 왼쪽 시프트 연산자                    왼쪽 -> 오른쪽
         >>        부호 비트를 확장하면서 비트 오른쪽 시프트        왼쪽 -> 오른쪽
         >>>        부호 비트까지 모두 비트 오른쪽 시프트         왼쪽 -> 오른쪽

    7)    
        <            관계 연산자(보다 작은)           왼쪽 -> 오른쪽
         <=            관계 연산자(보다 작거나 같은)      왼쪽 -> 오른쪽
        >=             관계 연산자(보다 큰)            왼쪽 -> 오른쪽
        =             관계 연산자(보다 크거나 같은)       왼쪽 -> 오른쪽
        instanceof     인스턴스의 실제 타입 반환           왼쪽 -> 오른쪽

    8)    
        ==            관계 연산자(와 같은)        왼쪽 -> 오른쪽
        !=            관계 연산자(와 같지 않은)       왼쪽 -> 오른쪽

    9)
        &            비트 AND 연산자    왼쪽 -> 오른쪽

    10)    
        ^    비트 XOR 연산자    왼쪽 -> 오른쪽

    11)    
        |    비트 OR 연산자    왼쪽 -> 오른쪽

    12)
        &&    논리 AND 연산자    왼쪽 -> 오른쪽

    13)
        ||    논리 OR 연산자    왼쪽 -> 오른쪽

    14)
        ? :    삼항 조건 연산자  왼쪽 -> 오른쪽

    15)
        =    대입 연산자 및 복합 대입 연산자
            (=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=)

화살표(->) 연산자


정의

람다 표현식으로, 메소드를 하나의 식으로 표현한 것

메소드의 매개변수로 전달 및 결과 값으로 반호나

사용이유

기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여 줌.


표현식

(x, y) -> x < y ? x : y;


유의사항

1) 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있음.

2) 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있음.    

3) 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있음. (이때 세미콜론(;)은 붙이지 않음)

4) 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없음.

5) return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됨. (이때 세미콜론(;)은 붙이지 않음)

예제코드

new Thread(new Runnable()
{
  public void run()
  {
      System.out.println("전통적인 방식의 일회용 스레드 생성");
  }
}).start();

// 실행결과
// > 전통 방식의 일회용 스레드 생성

new Thread(() -> {
    System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();

// 실행결과 
// > 람다 방식의 일회용 스레드 생성

3항 연산자


정의

피연산자를 세 개나 가지는 조건 연산자


문법

조건식 ? 반환값1 : 반환값2

물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, 결괏값이 거짓(false)이면 반환값2를 반환


예제코드

    int num1 = 5, num2 = 7;
    int result;

    result = (num1 - num2 > 0) ? num1 : num2;
    System.out.println("두 정수 중 더 큰 수는 " + result + "입니다.");

    // 실행결과
    // > 두 정수 중 더 큰 수는 7입니다.

instanceof


정의

참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환해 줍니다. 즉, 해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 판별해 주는 역할을 함


문법

인스턴스이름 instanceof 클래스또는인터페이스이름

왼쪽 피연산자인 인스턴스가 오른쪽 피연산자인 클래스나 인터페이스로부터 생성되었으면 true를 반환하고, 그렇지 않으면 false를 반환 함.

예제코드

class A {}

class B extends A {}

public static void main(String[] args) 
{
    A a = new A();
    B b = new B();

    System.out.println(a instanceof A); // true
    System.out.println(b instanceof A); // true
    System.out.println(a instanceof B); // false
    System.out.println(b instanceof B); // true
}

assignment(=) operator


정의

대입 연산자라고 하며 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽임.


복합 대입 연산자 종류

=    왼쪽의 피연산자에 오른쪽의 피연산자를 대입함.

+=    왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

-=    왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

*=    왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

/=    왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

%=    왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.

&=    왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

|=    왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

^=    왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

<<=    왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

>>=    왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

>>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

예제코드

int num1 = 7, num2 = 7, num3 = 7;

num1 = num1 - 3;
num2 -= 3;
num3 =- 3;

System.out.println("- 연산자에 의한 결과 : "+ num1);
// 실행결과 : 4

System.out.println("-= 연산자에 의한 결과 : "+ num2);
// 실행결과 : 4

System.out.println("=- 연산자에 의한 결과 : "+ num3);
// 실행결과 : -3

(optional) Java 13. switch 연산자


추가 된 내용

yield (yielding a value) 키워드 추가

switch가 표현식이 가능하게 되면서 반환 값 처리에 대해 명시를 위해 제공되는 기능 즉, "case L ->" 의 오른쪽 표현식이 블록으로 처리되는 경우 반환하는 값이 어떤 것인지 지정을 할 수 있게 됨.

예제코드

int j = switch (day) 
{ 
    case MONDAY -> 0; 
    case TUESDAY -> 1; 
    default -> { 
        int k = day.toString().length(); 
        int result = f(k); yield result; 
    } 
};

출처

Java 13. switc 내용 출처 : https://luvstudy.tistory.com/90

연산자 내용 image 출처 : TCP