Haneul's Blog

[Java] 연산자 본문

Java

[Java] 연산자

haneulss 2022. 10. 13. 10:54

백기선님 자바 스터디의 3주차 주제인 연산자에 대해서 자세하게 정리해보려고 합니다.

오늘은 부연 설명하지 않고 바로 시작하겠습니다.

 

 

목표 [백기선님 3주차 자바 스터디]

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

 

학습할 것

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

 

산술 연산자

수학적인 계산에 사용되는 연산자로 모두 두 개의 피 연산자를 가지는 이항 연산자 입니다.

 

위의 그림과 같이 총 5개의 산술 연산자가 있고, (*, /, %)가 (+, -)보다 우선순위를 갖습니다.

(/, %)를 사용하는 경우에는 나누는 수로 0을 사용하면 에러가 발생하기 때문에 잘 유의해서 사용해야 합니다.

 

 

비트 연산자

비트 연산자는 비트 단위로 논리 연산을 할 경우에 사용하는 연산자입니다.

~ 비트의 반전(Ex:0을 1로, 1을 0으로)
& 비트 단위 AND(Ex:1&1=1, 1&0=0, 0&0=0)
| 비트 단위 OR(Ex:0|0=0, 0|1=1, 1|0=1, 1|1=1)
^ 비트 단위 XOR(Ex:1^0=1,0^1=1,0^0=0, 1^1=0)
<< 왼쪽 쉬프트(Ex:a<<1, a를 1비트만큼 왼쪽으로 이동)
>> 오른쪽 쉬프트(Ex:a>>1, a를 1비트만큼 오른쪽으로 이동

 

~(비트 전환 연산자)

피연산자를 2진수로 표현했을 때, 0은 1로 1은 0으로 바꿔줍니다.

 

<<, >>(쉬프트 연산자)

피연산자의 각 자리를 <<(왼쪽), >>(오른쪽)으로 이동한다고 해서 쉬프트 연산자라고 합니다.

int a = 10; // 1010
// 1만큼 왼쪽 쉬프트한 결과는?
int b = a << 1; // 2진수로는 10100이 되기 때문에, 10진수로는 20(16+4)이 됩니다.

// 다시 오른쪽으로 1만큼 쉬프트 한 결과는?
int c = b >> 1; // 2진수로는 1010이 되기 떄문에, 10진수로는 10(8+2)이 됩니다.
                // 그 전에 a값과 다시 동일해지는 것을 알 수 있습니다.

 

 

|, &, ^(OR, AND, XOR 연산자)

| ( OR연산자 ) 피연산자 중 한 쪽값이 1이면, 1을 반환한다. 그 외에는 0 반환.
& ( AND연산자 ) 피연산자 중 양쪽이 모두 1이어야만 1을 반환한다. 그 외에는 0 반환.
^ ( XOR연산자 ) 피연산자의 값이 값이 서로 다를 때만 1을 반환한다. 같을 때는 0 반환.

 

관계 연산자

피연산자 사이의 상대적인 크기를 판단하는 연산자로 왼쪽과 오른쪽의 크기를 비교해주는 연산자입니다.

== 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참
!= 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참
> 왼쪽의 피연산자와 오른쪽의 피연산자가 크면 참
>= 왼쪽의 피연산자와 오른쪽의 피연산자가 크거나 같으면 참
< 왼쪽의 피연산자와 오른쪽의 피연산자가 작으면 참
<= 왼쪽의 피연산자와 오른쪽의 피연산자가 작거나 같으면 참

 

논리 연산자

주어진 논리식을 판단하여 참과 거짓을 결정해주는 연산자입니다.

&& 논리식이 모두 참이면 참반환
|| 논리식 중에 하나라도 참이면 참반환
! 논리식의 결과가 참이면 거짓, 거짓이면 참을 반환

 

instanceof

객체의 타입을 확인하는데 사용하는 연산자입니다.

 

사용 방법은 아래 예제를 참고하면 좋을 것 같습니다.

class Haneul extends Man {}

class Man {}

public class Test {

    public static void main(String[] args) {
        Haneul haneul = new Haneul();
        Man man = new Man();

        System.out.println(haneul instanceof Haneul); // true
        System.out.println(haneul instanceof Man); // true
        System.out.println(man instanceof Man); //true
        System.out.println(man instanceof Haneul); // false
    }
}

 

assignment(=) operator

쉽게 말하면 대입을 해주는 연산자로 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용합니다.

= 왼쪽 피연산자에 오른쪽의 피연산자를 대입
+= 왼쪽 피연산자에 오른쪽의 피연산자를 더한 후 대입
-= 왼쪽 피연산자에 오른쪽의 피연산자를 뺀 후 대입
*= 왼쪽 피연산자에 오른쪽의 피연산자를 곱한 후 대입
/= 왼쪽 피연산자에 오른쪽의 피연산자를 나눈 후 대입
%= 왼쪽 피연산자에 오른쪽의 피연산자를 나머지를 대입
&= 왼쪽 피연산자를 오른쪽의 피연산자를 비트 AND 연산한 후 대입
|= 왼쪽 피연산자를 오른쪽의 피연산자를 비트 OR 연산한 후 대입
^= 왼쪽 피연산자를 오른쪽의 피연산자를 비트 XOR 연산한 후 대입
<<= 왼쪽 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후 대입
>>= 왼쪽 피연산자를 오른쪽의 피연산자만큼 부호를 유지하고 오른쪽 시프트한 후 대입
>>>= 왼쪽 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후 대입

 

화살표(->) 연산자

Java8에서 추가된 것으로 화살표(->) 기호를 사용하여 람다표현식을 작성할 수 있습니다.
여기서 람다 표현식이란 메서드를 하나의 식으로 표현한 것을 의미합니다.

// 일반 메서드
int sum(int x, int y){
	return x + y;
}

// 람다식
(x, y) -> x + y;

// 둘의 결과는 같습니다.

이러한 람다 표현식을 사용할 경우에 유의할 점이 있습니다.

  1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.
  2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
  3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다.
  4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
  5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결과값이 됩니다. 

 

3항 연산자

3항 연산자는 위의 그림과 같은 방법을 사용하여 간단한 조건식을 사용하여 값을 대입하고 싶을 경우에 사용하는 연산자를 의미합니다.
코드를 간결하고 직관적으로 나타낼 수 있다는 장점이 있습니다.

int x = 3;
int y = 4;
int result = x > y ? x : y; // result의 값은 4가 됩니다.

 

연산자 우선 순위

연산자 우선순위는 아래의 표를 참고하면 좋을 것 같습니다.

 

Java 13. switch 연산자

기존에 switch 연산자가 있었는데 Java13에서 switch 연산자를 약간 변경한 것 같습니다.
항상 무엇인가를 변경할 때 문제가 있으니까 변경을 한다고 생각을 해서 찾아보니 기존의 불필요한 장황함, 디버깅이 어렵다는 문제 때문에 조금 더 업그레이드 했다고 합니다.

 

switch문에 람다식을 사용할 수 있게 되어서 조금 더 간결하고 직관적으로 변경되었고, break가 아닌 yield를 사용하여 산출값이 리턴 가능하게 되었습니다.

 

기존 switch

 

private static int getValueViaBreak(String mode) {
    int result = switch (mode) {
        case "a":
        case "b":
            break 1;
        case "c":
            break 2;
        case "d":
        case "e":
        case "f":
            break 3;
        default:
            break -1;
    };
    return result;
}

Java13의 switch

private static int getValueViaArrow(String mode) {
    int result = switch (mode) {
        case "a", "b" -> 1;
        case "c" -> 2;
        case "d", "e", "f" -> {
            // do something here...
            System.out.println("Supports multi line block!");
            yield 3;
        }
        default -> -1;
    };
    return result;
}

'Java' 카테고리의 다른 글

[Java] 상속  (0) 2022.10.17
[Java] 클래스  (0) 2022.10.16
[Java] 제어문  (0) 2022.10.15
[Java] 자바 데이터 타입, 변수 그리고 배열  (0) 2022.10.12
[Java] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.  (0) 2022.10.11