목표

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

학습할 것

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

1. 산술 연산자

산술 연산자는 것은 수학적인 연산에 사용할 수 있는 기호(이하 연산자)를 말한다.

+ 덧셈
- 뺄셈
* 곱하기
/ 나누기
% 나머지

 

예제

class Main {

  public static void main(String[] args) {
      // 덧셈: result 의 값은 3
      int result = 1 + 2;
      System.out.println(result);
      
      // 뺄셈: result 의 값은 1
      result = result - 2;
      System.out.println(result);
      
      // 곱셈: result 의 값은 4
      result = result * 4;
      System.out.println(result);
      
      // 나눗셈: result 의 값은 2
      result = result / 2;
      System.out.println(result);
      
      // 나머지: result 의 값은 0
      result = result % 2;
      System.out.println(result);
  }
}
  • 덧셈: 1 + 2 (각각 리터럴)을 더해서 result라는 변수에 저장한다.
  • 뺄셈: result에서 -2를 하고 있다. 3 - 2 이므로 결과는 1이 된다.
  • 곱셈: result (현재 1) 에 4를 곱하고 있다. 1 * 4 이므로 결과는 4가 된다.
  • 나눗셈: result(현재 4)에 2를 나누고 있다. 4 / 2 이므로 결과는 몫인 2가 된다.
  • 나머지: result(현재 2)에 2를 나눈 나머지를 구하고 있다. 2/2 이므로 0이 된다.

 

2. 비트 연산자

연산을 우리가 알고 있는 10진수등으로 처리하는게 아니라 2진수 형태(10101010)로 각각 계산할 수 있게 도와주는 연산자이다. 

 x << y 정수 x의 각 비트를 y만큼 왼쪽으로 이동 (빈자리는 0으로 채워짐)
x >> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동 (빈자리는 정수 x의 최상위 부호비트와 같은 값으로 채워짐)
x >>> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동 (빈자리는 0으로 채워짐)
& AND 연산하는 비트가 둘다 1일 경우 1
| OR 연산하는 비트가 하나라도 1이면 1
^ XOR 연산하는 비트가 서로 다르면 1
~ NOT 해당 비트의 반전 (1이면 0, 0이면 1)
public class module03 {
    public static void main(String[] args) {
        int result = 2;

        // 2 << 3 의 결과는 16
        result = result << 3;
        System.out.println(result);

        // 16 >> 3의 결과는 2
        result = result >> 3;
        System.out.println(result);

        // -16 >> 3의 결과는 -2
        result = -16;
        System.out.println(result >> 3);

        // -16 >>> 3의 결과는 536870910
        System.out.println(result >>> 3);


        // bit AND 연산은 0 (1010 & 0101로 연산)
        int bitLiteral1 = 10;
        int bitLiteral2 = 5;
        System.out.println(bitLiteral1 & bitLiteral2);

        // bit OR 연산은 15 (1010 | 0101로 연산)
        System.out.println(bitLiteral1 | bitLiteral2);

        // bit XOR 연산은 15 (1010 ^ 0101로 연산)
        System.out.println(bitLiteral1 ^ bitLiteral2);

        // 25의 반전은 -26
        int bitLiteral3 = 25;
        System.out.println((~bitLiteral3));
    }
}
  • 2 와 3을 이진수로 표현하면 각각 0010 과 0011로 표현할 수 있다.
  • 첫번째 2 << 3 하는 부분은 아래와 같이 연산된다.

출처: https://coding-factory.tistory.com/521

2 진수를 위와 같이 나타내고 왼쪽으로 3비트 만큼 shift 시키는 연산이다. 그러면 빈 부분 (그림에서 ? 부분)은 0으로 자동 채워진다. 단, 다른 shift 연산에서 주의할 점은 >> (오른쪽 shitf)는 부호 비트로 채워진다라는 점이다.
(해당 내용을 이해하려면 2진수의 음수와 양수 표시에 대한 것이 필요하며, 간단하게 설명하면 제일 앞의 비트가 양수일때는 0, 음수일때는 1로 표기한다.) 

  • bit AND 연산은 아래와 같이 계산된다.

  • bit OR 연산은 아래와 같이 계산된다.

  • bit XOR 연산은 아래와 같이 계산된다.
    얼핏 보기에는 OR 연산과 차이가 없어 보이지만 서로 다른 비트인 경우 1이 되는 독특한 연산이다.

  • NOT 연산은 비트의 반전이다. 다만 부호 표기에 유의해서 연산해야하는 부분이 있다.

 

3. 관계 연산자

자바에서 사용되는 관계 연산자는 아래와 같다.

> 왼쪽 항이 크면 참, 아니면 거짓 반환
< 왼쪽 항이 작으면 참, 아니면 거짓 반환
>= 왼쪽 항이 오른쪽보다 같거나 크면 참, 아니면 거짓
<= 왼쪽 항이 오른쪽보다 같거나 작으면 참, 아니면 거짓
== 두개의 항이 같으면 참, 아니면 거짓
!= 두 개 항이 다르면 참, 아니면 거짓

 

4. 논리 연산자

자바에서 사용되는 관계 연산자는 아래와 같다.
비트 연산자와 표기법이 다르다. AND와 OR는 각각 기호를 한번더 써야 하고 NOT은 아예 기호 자체가 다르므로 주의해서 써야 한다.

&& AND 두 항이 모두 참인 경우 참
||  OR 두 항이 하나만 참이여도 참
! NOT 단항 연산, 참인 경우 거짓, 거짓인 경우 참으로 바꿈

 

5. instanceof

instanceof 연산자는 참조변수가 참조하고 있는 인스턴스의 타입을 알아보기 위해 사용한다.
연산의 결과는 true, false 형태로 리턴된다.

아래를 보면 car(참조변수)의 인스턴스 타입이 Car 인지 확인하고 있다.

public class module03 {
    public static void main(String[] args) {
        Car car = new Car();

        // Car의 클래스타입인지 확인
        System.out.println(car instanceof Car);

    }

    static class Car {

    }
}

 

6. assignment(=) operator

자바의 할당 연산자는 값을 변수에 할당할 때 사용가능한 연산자를 말한다.

연산자 종류 설명
= a = 10 인경우 a에 10을 할당
+= a +=2 인 경우 a = a + 2의 의미와 같음
*= a *= 2 인 경우 a = a * 2의 의미와 같음
>>= a >>= 2 인 경우 a = a >> 2와 같음

위 연산자에 더해서 -=, /=, %=, &=, |=, ^=, >>=, >>>=, <<= 가 더 있음

7. 화살표(->) 연산자

자바의 화살표 연산자는 람다 표현식이라고 얘기할 수 있다. 람다 표현식이란 간단히 말해 메소드를 하나의 식으로 표기 하는 방식이다.
람다 표현식의 문법은 아래와 같이 사용가능하다.
(매개변수목록) -> { 함수 몸체}

// 일반 메서드
int min(int x, int y) {

    return x <= y ? x : y;

}

// 람다 표현식으로 변경
(x, y) -> x <= y ? x : y;

람다 표현식의 장점은 심플하게 메서드를 표현 가능하기 때문에 많은 개발자들이 활용하고 있다. 단, 자바 8이상 부터 지원이기 때문에...혹시나 공공 사이트나 다른 오래된 JDK를 사용하는 경우 유의해야 한다.

8. 3항 연산자

삼항 연산자는 7에서 이미 나온 내용이다.
문법은 아래와 같다.

(조건식)? 참이면 리턴할 구문 : 거짓이면 리턴할 구문;

// 일반 메서드
// x 와 y를 받아서 x 가 y보다 같거나 작으면 x를, 반대이면 y를 리턴한다.
int min(int x, int y) {

    return x <= y ? x : y;

}

 

9. 연산자 우선 순위

연산자를 사용하다 보면 겹쳐서 사용하게 되는 경우가 많다. 이럴 때 연산자의 우선순위를 이미 알고 처리를 하거나 해야 하는데 생각보다 쉽지않다. 실무에서 활용할 때는 연산자 우선순위에 의거해서 표현하지 말고 () 괄호를 통해서 명확하게 의도를 표현하는 것이 좋다.

우선순위 연산자
1 최우선연산자 ( ., [], () )
2 단항연산자 ( ++,--,!,~,+/-   : 부정, bit변환>부호>증감)
3 산술연산자 ( *,/,%,+,-,shift) < 시프트연산자 ( >>,<<,>>> ) >
4 비교연산자 ( >,<,>=,<=,==,!= )
5 비트연산자 ( &,|,,~ )
6 논리연산자 (&& , || , !)
7 삼항연산자 (조건식) ? :
8 대입연산자 =,*=,/=,%=,+=,-=

 

+ Recent posts