[Java] 연산자
본문 바로가기
Java

[Java] 연산자

by IYK2h 2023. 4. 19.
728x90

목표

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

학습할 것

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선순위
  • Java 13. switch 연산자

학습 내용 정리

연산자

  • 연산자: 연산에 사용되는 기호
  • 피연산자: 연산에 대한 대상

ex

// 연산자: +, 피연산자: 1, 2
1 + 2;

int a = 2;
int b = 3;

// 연산자: *, 피연산자: a, b
a * b;

산술 연산자

  • Binary Operator(이항 연산자)
    • +, -, *, /, %(Modulo)
    • Arithmetic Exception(산술 예외) 발생 가능
      INF "무한"또는 INF 값은 너무 큰 숫자를 나타냅니다. +INF 값은 너무 크고 양수 인 숫자를 나타냅니다. -INF 값은 너무 크고 음수 인 숫자를 나타냅니다. INF 값은 오버플로를 일으키는 부동 연산 또는 0으로 나누는 부동 소수점 연산에 의해 생성됩니다
      NAN "무기한"/ "숫자가 아님"또는 NaN은 의미 없는 작업으로 인해 발생하는 값을 나타냅니다. NaN 값은 0을 0으로 나누거나 0을 나머지로 계산하여 생성됩니다
int a = 1 + 2;
int b = 4 - a;
int c = a * b;
// type casting 발생
double d = c / 2;
double e = c % 2;

// Divide by zero error 
double DivideByZero = c / 0;
// Modulo by zero error 
double ModuloByZero = c % 0;

비트 연산자

각각의 비트를 대상으로 연산을 진행하는 연산자이며 피연산자는 반드시 정수이어야 한다.

연산자 연산자의 기능 결합 방향
& 비트 단위로 AND 연산을 한다. ->
| 비트 단위로 OR 연산을 한다 ->
^ 비트 단위로 XOR 연산을 한다. ->
~ 피연산자의 모든 비트를 반전시켜 얻은 결과를 반환한다. (단일항) <-

비트 시프트 연산자

피연산자의 비트 열을 왼쪽 또는 오른쪽으로 이동시킨 결과를 반환하는 함수이다.

연산자 연산자의 기능
<< 피연산자의 비트 열을 왼쪽으로 이동한다. 이동에 따른 빈 공간은 0으로 채운다.
>> 피연산자의 비트 열을 오른쪽으로 이동한다. 이동에 따른 빈 공간은 음수는 1, 양수는 0으로 채운다.
>>> 피연산자의 비트 열을 오른쪽으로 이동한다. 이동에 따른 빈 공간은 0으로 채운다.
int a = 3 & 1;  // 0011 & 0001 = 1 (0001)
int b = 2 | 1;  // 0010 | 0001 = 3 (0011)
int c = 3 ^ 1;  // 0011 ^ 0001 = 2 (0010)
int d = 2 >> 1; // 0010 에서 왼쪽으로 1칸 이동, 1 (0001)
int e = 2 << 1; // 0010 에서 오른쪽으로 1칸 이동, 4 (0100)
int f = ~1;     // 0001 -> 1111 1111 1111 1111 1111 1111 1111 1110

관계 연산자

관계 연산자 설명
== 같으면 true.
!= 다르면 true.
> 왼쪽이 크면 true.
>= 왼쪽이 오른쪽보다 더 크거나 같으면 true.
< 오른쪽이 크면 true.
<= 오른쪽이 왼쪽보다 더 크거나 같으면 true.

논리 연산자

  • Binary Operator(이항)
    • && (LOGICAL AND)
    • || (LOGICAL OR)
  • 피연산자의 타입은 boolean
  • 연산 결과 타입은 boolean

&& (LOGICAL AND)

피연산자1 피연산자2 연산 결과
true true true
true false false
false true false
false false false

|| (LOGICAL OR)

피연산자1 피연산자2 연산 결과
true true true
true false true
false true true
false false false

instanceof

객체가 특정 클래스 / 인터페이스 유형인지 여부를 확인 및 객체의 타입을 비교할 때 사용한다.

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

  • Binary Operator(이항)
    • = (ASSIGN)
    • += (ADD and ASSIGN)
    • -= (SUBTRACT and ASSIGN)
    • *= (MULTIPLY and ASSIGN)
    • /= (DIVIDE and ASSIGN)
    • %= (MODULO and ASSIGN)
    • &= (AND and ASSIGN)
    • ^= (XOR and ASSIGN)
    • |= (OR and ASSIGN)
    • <<= (LEFT SHIFT and ASSIGN)
    • >>= (RIGHT SHIFT and ASSIGN)
    • >>>= (UNSIGNED RIGHT SHIFT and ASSIGN)
i += 2;         // i = i + 2 와 같음

// 비트 및 Shift 연산자와 결합해서 사용할 수 있음.
int a =  2;  // 0010
// ~a : -3 (11111111111111111111111111111101)
a |= ~a; // 1 (11111111111111111111111111111111)

화살표(->) 연산자

Java 8 버전부터 람다 표현식(lambda expression) 이 공식적으로 적용되었다.

코드가 간결해진다는 장점이 있다.

(인자, ...) -> { /* 메소드 바디 */ } 화살표 왼쪽에 인자, 오른쪽에 실제 표현식을 쓴다.

a -> a + 1              // a lambda that adds one to its argument
a -> { return a + 1; }  // an equivalent lambda using a block.
// 두 개의 숫자 더하기 
public interface Compare {
    public int compareTo(int a, int b);
}

public static void exec(Compare compare) {
    int k = 10;
    int m = 20;
    int value = compare.compareTo(k, m);
    System.out.println(value);
}

public static void main(String[] args) {
    exec((i, j)->{ // compareTo(int a, int b) 부분, Compare 인터페이스를 구현
        return i+j;
    });
}
// 두 개의 숫자 중 큰 수 출력
public class Main{
    @FunctionalInterface
    public interface Compare {
        int getMax(int n1, int n2);
    }

    public static void main(String[] args) {
        Compare max = (x, y) -> {
            if (x >= y) {
                return x;
            } else {
                return y;
            }
        };
        System.out.println(max.getMax(4, 10)); // 10
    }
}
// Runnable 인스턴스 생성 
Runnable runnable = ()->{
    for(int i=0; i<30; i++) {
        System.out.println(i);
    }
};
Thread thread = new Thread(runnable);
thread.start();
// Thread 생성 
Thread thread = new Thread(()->{
    for(int i=0; i<30; i++) {
        System.out.println(i);
    }
});
thread.start();

3항 연산자

if-else 구문을 간결하게 만든 표현식

Conditional Expression ? Expression(true인 경우) : Expression(false 인 경우);

if-else와 3항 연산자 성능 면에서 크게 차이 나지 않는다.

2~3개의 값을 비교하기엔 3항 연산자가 가독성이 좋다. 3개를 넘어가면 가독성이 떨어진다.

연산자 우선순위

우선 순위 연산자 설명 연산 방향
0 (), [] 괄호 / 대괄호  
1 expr++ ㅤ expr-- 후위 증가/감소 연산자 사후 증가
2 ++expr ㅤ --expr ㅤ +expr ㅤ -expr ㅤ ~ ㅤ ! 전위 증가/감소 연산자, 양/음 부호, 논리/비트 NOT 연산자 <---
3 * ㅤ / ㅤ % 곱셈/나눗셈/나머지 연산자 --->
4 + ㅤ - 덧셈/뺄셈 연산자 --->
5 << ㅤ >> ㅤ >>> 비트 왼쪽/오른쪽 Shift 연산자, Unsigned Shift 연산자 --->
6 < ㅤ > ㅤ <= ㅤ >= ㅤ instanceof 보다 작은/보다 큰/보다 작거나 같은/보다 크거나 같은 관계 연산자, instanceof --->
7 == ㅤ != 와 같은/와 다른 관계 연산자 --->
8 & 비트 AND 연산자 --->
9 ^ 비트 XOR 연산자 --->
10 | 비트 OR 연산자 --->
11 && 논리 AND 연산자 --->
12 || 논리 OR 연산자 --->
13 ? : 삼항 조건 연산자 --->
14 = ㅤ += ㅤ -= ㅤ *= ㅤ /= ㅤ %= ㅤ &= ㅤ ^= ㅤ |= ㅤ <<= ㅤ >>= ㅤ >>>= 대입 연산자 및 복합 대입 연산자 <---

 

728x90

댓글