본문 바로가기
자바

[Java] 자바의 연산자

by 책 읽는 개발자_테드 2021. 8. 20.
반응형

[Java] 자바의 연산자 

학습 목표

- 배경지식

- 산술 연산자

- 비트 연산자

  비트 논리 연산자

  비트 이동 연산자

  비트 반전 연산자 (~)

- 관계(비교) 연산자

- instanceof

- assignment(=) operator , 대입 연산자

- 화살표(->) 연산자

- 삼항 연산자

- 연산자 우선 순위

- Java 13. switch 연산자


배경지식

연산(operation): 프로그램에서 데이터를 처리하여 결과를 산출하는 것

연산자(operator):연산에 사용되는 표시나 기호

피연산자(operand): 연산되는 데이터

연산식(expression): 연산자와 피연산자를 이용하여 연산의 과정을 기술할 것

// 다음에서 +, *, =, ==은 연산자이고 a, b 변수는 피연산자다

a + b
a = a * b
a == b

 

산술 연산자

- 사칙 연산인 더하기(+), 빼기(-), 곱하기(*),나누기(/)와 나머지를 구하는 연산자(%)를 말함

- boolean 타입을 제외한 모든 기본 타입에 사용 가능

- 산술 연산자는 피연산자들의 타입이 동일하지 않으면, 다음과 같은 규칙으로 타입을 일치시킨 후 연산을 수행

 

1. 피연산자들이 모두 정수 타입이고, int타입 보다 크기가 작은 타입이라면 모두 int 인트 타입으로 변환 후 연산

2. 피연산자들이 모두 정수 타입이고, long 타입이 있을 경우 모두 long 타입으로 변환 후 연산

3. 피연산자 중 실수 타입(float, double)이 있을 경우, 크기가 큰 실수 타입으로 변환 후 연산을 수행

 

 

비트 연산자

비트(bit)단위로 연산하기위한 연산자

 

특징

1. 0과 1이 피연산자가 되기 때문에 0과 1로 표현 가능한 정수 타입만 비트 연산 가능

(실수 타입인 float와 double은 비트 연산 불가능)

2. 기능에 따라 비트 논리 연산자(&, |, ^, ~)와 비트 이동 연산자(<<, >>, >>>)로 구분

 

비트 논리 연산자

일반 논리 연산자는 true와 false을 연산한다면, 비트 논리 연산자는 0과 1을 연산

public class Main {
    public static void main(String[] args) {
        int num1 = 43;  //00101011(2)
        int num2 = 17;  //00010001(2)

        int result1 = num1 & num2; // 00101011(2) & 00010001(2) = 00000001(2)
        int result2 = num1 | num2; // 00101011(2) | 00010001(2) = 00111011(2)
        int result3 = num1 ^ num2; // 00101011(2) ^ 00010001(2) = 00111010(2)
        int result4 = ~num1; // ~00101011(2)

        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
        System.out.println(result4);
    }
}

결과

- 논리 연산자는 연산자는 첫 번째 조건에서 결과가 확실히 결정되면 나머지 피연산자를 계산하지 않는다.

ex) A && B의 A-false, A || B 의 A-true

 

비트 이동 연산자

비트를 좌측 또는 우측으로 밀어서 이동시키는 연산자

예시

1 << 3의 연산 결과는 8이다.

 

-8 >> 3의 연산 결과는 -1이다.

 

 

-8 >>>3의 연산 결과는 536870911이다.

 

비트 반전 연산자 (~)

피연산자를 2진수로 표현했을 때 비트값 0을 1로, 1은 0으로 반전하는 연산자

public class Main {
    public static void main(String[] args) {
        int num = 10;                         // 00...01010(2)
        System.out.println(~num);  //결과: -11 즉, 11...10101(2)
   }
}

 

특징

1. 정수 타입의 피연산자에만 사용

2. 비트 반전 연산자의 산출 타입은 int

 

때문에 다음은 컴파일 에러가 발생한다.

public class Main {
    public static void main(String[] args) {
        byte num1 = 1;
        byte num2 = ~num1;
   }
}

다음과 같이 변경하자.

public class Main {
    public static void main(String[] args) {
        byte num1 = 1;
        int num2 = ~num1;
   }
}

 

3. 비트 반전 연산자의 산술값 1을 더하면 부호가 반대인 정수를 얻을 수 있음

public class Main {
    public static void main(String[] args) {
        int num1 = 999;
        int num2 = ~num1 +1;
        System.out.println(num2);
   }
}

 

결과

 

 

관계(비교) 연산자

대소(<, <=, >, >=) 또는 동등(==, !=)을 비교하여 boolean 타입인 true/false를 산출하는 연산자

특징

1. 대소 연산자는 boolean 타입을 제외한 기본 타입에 사용 가능, 동등 연산자는 모든 타입에 사용 가능

2. 피연산자가 char 타입이면 유니코드 값으로 비교 연산을 수행

3. 관계 연산자는 연산을 수행하기 전에 타입 변환을 통해 타입을 일치시킴 

 

예) 'A'==65는 'A'가 int 타입으로 변환되어 64==64로 비교, 3==3.0은 3이 double 타입으로 변환되어 3.0 = 3.0으로 비교.

예외) 0.1 == 0.1f는 0.1f이 float형에서 double로 변환되지만 결과는 false가 산출된다. 이진 포맷의 가수를 사용하는 모든 부동소수점타입은 0.1을 정확히 표현할 수 없기 때문이다. 0.1f은 0.10000000149...으로 변환된다. 때문에 정확한 결과를 원한다면 피연산자 모두 float 타입 또는 정수로 강제 변환하여 연산하자. 

 

public class Main {
    public static void main(String[] args) {
              int num1 = 1;
              int num2 = 2;
              boolean result1 = (num1 == num2);
              boolean result2 = (num1 != num2);
              boolean result3 = (num1 <= num2);

              double num3 = 1.0;
              float num4 = 0.1f;
              double num5 = 0.1;

              boolean result4 = (num1 == num3);
              boolean result5 = (num4 == num5);
              boolean result6 = (num4 == (float)num5);

              System.out.println("result1="+ result1);
              System.out.println("result2="+ result2);
              System.out.println("result3="+ result3);
              System.out.println("result4="+ result4);
              System.out.println("result5="+ result5);
              System.out.println("result6="+ result6);
            }
}

 

결과

 

논리 연산자

하나의 조건을 구성하기 위해 여러 개의 조건이 조합되어 쓰이는 연산자

특징

1. 논리 연산자의 피연산자는 boolean 타입만 사용할 수 있다.

2. &&와 &연산자는 산출 결과는 같지만 연산 과정이 다르다. &&는 앞의 피연산자가 false면 뒤의 연산자를 평가하지 않고 바로 false라는 산출 결과를 낸다. 그러나 &는 두 피연산자 모두 평가해서 산출 결과를 낸다. 즉, &&가 더 효율적으로 동작한다.

 

3. ||와 |도 마찬가지다. ||는 앞의 피연산자가 true라면 뒤의 피연산자를 평가하지 않고 바로 true라는 산출 결과를 내고, |는 두 피연산자를 모두 평가한 후 산출 결과를 낸다.

 

instanceof

instanceof 연산자는 객체가 지정된 유형(class or subclass or interface)의 인스턴스인지 여부를 확인하는데 사용된다.

 

특징

1. 객체가 지정된 유형의 인스턴스라면 true, 아니면 false를 반환한다.

2. null 값을 가진 변수에 사용하면 무조건 false를 반환한다.

 

public class Main {
    public static void main(String[] args) {
        Main m = new Main();
        System.out.println(m instanceof Main);
    }
}

결과

 

assignment(=) operator , 대입 연산자

 

대입 연산자는 오른쪽 피연산자의 값을 좌측 피연산자에 저장한다. 이때 값을 단순히 저장하는 대입 연산자 뿐만아니라 정해진 연산을 수행한 후 결과를 변수에 넣는 대입 연산자도 있다.

 

특징

1. 오른쪽 피연산자는 리터럴, 변수 그리고 연산식이 올 수 있다.

2. 대입 연산자는 모든 연산자들 중에서 가장 낮은 연산 순위를 가지고 있어, 제일 마지막에 수행된다.

연산식 설명
변수 = 피연산자 우측 피연산자의 값을 변수에 저장
변수 += 피연산자 우측 피연산자의 값을 변수의 값과 더한 후 다시 변수에 저장
변수 -= 피연산자 우측 피연산자의 값을 변수의 값에서 뺀 후 다시 변수에 저장
변수 *= 피연산자 우측 피연산자의 값을 변수의 값과 곱한 후 다시 변수에 저장
변수 /= 피연산자 우측 피연산자의 값으로 변수의 값을 나눈 후에 다시 변수에 저장
변수 %= 피연산자 우측 피연산자의 값으로 변수의 값을 나눈 후 나머지를 변수에 저장
변수 &= 피연산자 우측 피연산자의 값과 변수의 값을 & 연산 후 결과를 변수에 저장
변수 |= 피연산자 우측 피연산자의 값과 변수의 값을 | 연산 후 결과를 변수에 저장
변수 ^= 피연산자 우측의 피연산자의 값과 변수의 값을 ^ 연산 후 결과를 변수에 저장
변수 <<= 피연산자 우측의 피연산자의 값과 변수의 값을 << 연산 후 결과를 변수에 저장
변수 >>= 피연산자 우측의 피연산자의 값과 변수의 값을 >> 연산 후 결과를 변수에 저장
변수 >>>= 피연산자 우측의 피연산자 값을 >>> 연산 후 결과를 변수에 저장

 

 

화살표(->) 연산자

 

화살표 연산자는 람다 파라미터와 람다 바디를 구분하는 역할을 한다.

 

 

람다는 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다.

//기존 코드
Comparator<Apple> byWeight = new Comparator<Apple>() {
          @Override
          public int compare(Apple a1, Apple a2) {
              return a1.getWeight().compareTo(a2);
          }
};

//람다를 이용한 코드
Comparator<Apple> byWeight2 = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
       

 

 

삼항 연산자

삼함 연산자(?:는 세 개의 피연산자가 필요로하는 연산자다.

 

특징

1. ? 앞의 조건식에 따라 콜론(:) 앞뒤의 피연산자가 선택되기 때문에 조건 연산식이라고 부르기도 한다.

2. 조건식을 연산하여 true가 나오면 결과는 피연산자2가 되고, false가 나오면 결과는 피연산자3이 된다.

3. 피연산자2와 3에는 값 또는 연산식이 올 수 있다.

 

public class Main {
    public static void main(String[] args) {
               int age = 65;
               String name = (age>=65) ? "제임스" : "고슬링";
               System.out.println("name: "+ name);
            }
}

결과

 

연산자 우선 순위

 

출처

이것이 자바다

WHITESHIP LIVE 자바 스터디

F-lab

www.youtube.com/watch?v=rPYhY5kFD5k

github.com/whiteship/live-study/issues/3

mkyong.com/java/java-13-switch-expressions/

www.javatpoint.com/downcasting-with-instanceof-operator

반응형

댓글