본문 바로가기

프로그래밍/Java

연산자

산술 연산자

산술 연산자는 사칙 연산자와 나머지 연산자가 있으며 연산자의 우선순위는 곱셈(*), 나눗셈(/),나머지(%)가 덧셈(+) 뺄셈(-) 연산자보다 높다.

public static void main(String[] args) {
    int a = 10;
    int b = 4;
    float c = 4.0;
    System.out.println("a + b = " + (a + b));   //14
    System.out.println("a - b = " + (a - b));   //6
    System.out.println("a % b = " + (a % b));   //40
    System.out.println("a * b = " + (a * b));   //2
    System.out.println("a / b = " + (a / b));   //2
    System.out.println("a / c = " + (a / c));   //2.5
}

피 연산자가 정수형인경우 0으로 나눌 수 없으며 나누기 연산자에서 피연산자가 모두 int형 이면 실제 결괏값은 2.5이지만 정수형만 저장되고 소수점은 버려지게 된다. 한쪽을 실수형으로 형변환하면 다른 한쪽도 자동으로 형변환이 되어 올바른 값을 얻을 수 있다.

비트 연산자

비트 연산자는 비트단위로 논리 연산을 할 때 사용한다.

  • | (OR연산자) : 피연산자 중 하나라도 1이면 1을 반환한다.
  • & (AND연산자) : 피연산자 모두 1이면 1을 반환한다.
  • ^ (XOR연산자) : 피연산자가 서로 다를때만 1을 반환한다.
  • ~ (NOT연산자) : 1이면 0으로, 0이면 1로 바꾼다.
public class Test {
    public static void main(String[] args) {
        int x = 10;
        int y = 13;
        System.out.println(Integer.toBinaryString(x));
        System.out.println(Integer.toBinaryString(y));
        System.out.println("| OR 연산 결과: " + Integer.toBinaryString(x | y));
        System.out.println("& AND 연산 결과: " + Integer.toBinaryString(x & y));
        System.out.println("^ XOR 연산 결과: " + Integer.toBinaryString(x ^ y));
        System.out.println("~ NOT 연산 결과: " + Integer.toBinaryString(~x));
    }
}

출력 결과

1010
1101
| OR 연산 결과: 1111
& AND 연산 결과: 1000
^ XOR 연산 결과: 111
~ NOT 연산 결과: 11111111111111111111111111110101

int는 4바이트(32bit)를 사용하기에 NOT연산을 할 경우 0을 1로 채워 32자리로 표현됩니다.

쉬프트 연산자

비트단위로 왼쪽이나 오른쪽으로 비트를 이동할 때 사용합니다.

  • << : 명시된 수만큼 왼쪽으로 이동시키며, 빈자리는 0으로 채움
  • >> : 부호를 유지하면서 지정한 수만큼 오른쪽으로 이동
  • >>> : 지정한 수만큼 오른쪽으로 이동시키며, 빈자리는 0으로 채움
public class Test {
    public static void main(String[] args) {
        int x = 10;
        int y = 2;
        int z = -10;
        System.out.println(Integer.toBinaryString(x));
        System.out.println(Integer.toBinaryString(x<<y));
        System.out.println(Integer.toBinaryString(x>>y));
        System.out.println(Integer.toBinaryString(z));
        System.out.println(Integer.toBinaryString(z>>>y));
    }
}

출력 결과

1010
101000
10
11111111111111111111111111110110
111111111111111111111111111101

>>>의 경우 피연산자가 음수인 경우 부호 비트까지 이동하여 >>와 다른 결과를 보여준다.

// -10>>>2
11111111111111111111111111110110    // 이동 전
  11111111111111111111111111110110  // 오른쪽 2비트 이동후 삭제
00111111111111111111111111111101    // 앞에 빈 두 자리에 0으로 채움

관계 연산자

비교 연산자로 피연산자를 비교할 때 사용되며 연산 결과는 true와 false이다.

  • > : 왼쪽 피연산자가 오른쪽보다 작으면 참
  • < : 왼쪽 피연산자가 오른쪽보다 크면 참
  • >= : 왼쪽 피연산자가 오른쪽보다 크거나 같으면 참
  • <= : 왼쪽 피연산자가 오른쪽보다 크거나 같으면 참
  • == : 왼쪽 피연산자가 오른쪽 피연산자와 같으면 참
  • != : 왼쪽 피연산자가 오른쪽 피연산자와 같지 않으면 참
public class Test {
    public static void main(String[] args) {
        int x = 10;
        int y = 2;
        char z = 'a';
        System.out.println(x == y); //false
        System.out.println(x != y); //true
        System.out.println(x > y);   //true
        System.out.println(z >= x); //true
        System.out.println(x < y);   //false
        System.out.println(x <= y); //false
    }

문자'a'의 유니코드는 10진수로 97이며 z >= x97>=10이 되어 참이다.

논리 연산자

논리 연산자는 논리식의 참, 거짓을 결정할 때 사용합니다.

  • && : 피연자가 모두 참이면 참을 반환
  • || : 피연산자가 하나라도 참이면 참을 반환
  • ! : 피연산자가 하나이며 참이면 거짓, 거짓이면 참을 반환

instanceof

instanceof 연산자는 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 확인할때 사용한다.
참조변수가 오른쪽의 클래스나 인터페이스에서 생성되었으면 true 아니면 false를 반환.
사용법

참조변수 instanceof 클래스or인터페이스이름
public class Test {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println(a instanceof A); //true
        System.out.println(a instanceof B); //false
        System.out.println(b instanceof B); //true
    }
}
class A{}
class B extends A{}

assignment(=) operator

대입 연산자는 변수에 값을 대입할 때 사용하며 다른 연산자와 결합하여 사용할 수 있습니다.

  • = : 오른쪽 피연산자를 왼쪽 피연산자에 대입
    연산자와 결합하여 사용할 경우 연산자= 으로 사용하며 공백 없이 사용해야 합니다.
    +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=
ex)
i += 3은 i = i + 3과 동일
i /= 3은  i = i / 3과 동일

3항 연산자

자바에서는 유일하게 피연산자를 3개를 가지는 연산자로 ?앞의 조건식이 참이면 반환값1을 반환 거짓이면 반환값2를 반환한다.

조건식 ? 반환값1 : 반환값2
public class Test {
    public static void main(String[] args) {
        int a = 10, b = 20;
        char c;
        c = (a > b) ? 'a' : 'b';
        System.out.println("a와 b중 큰 값은 "+c);
    }
}

출력 결과

a와 b중 큰 값은 b

연산자 우선순위

우선순위를 모두 외울 필요는 없지만 익숙해지면 자연스럽게 체득이 되는 듯하고 필요할 때마다 참고하면 되니다.

  1. 후위 증감 연산자 : ++, --
  2. 전위 증감 연산자 부호 연산자, 논리, 비트 연산자: ++, --, +, -, !, ~
  3. 곱셈, 나눗셈, 나머지 연산자: *, /, %
  4. 덧셈, 뺄셈 연산자: +, -
  5. 비트 쉬프트 연산자: <<, >>, >>>
  6. 관계연산자(크다 작다), instanceof: >, <, >=, <=, instanceof
  7. 관계연산자(같다, 같지않다): ==, !=
  8. 비트 AND 연산자: &
  9. 비트 XOR 연산자: ^
  10. 비트 OR 연산자: |
  11. 논리 AND 연산자: &&
  12. 논리 OR 연산자: ||
  13. 삼항 연산자: ? :
  14. 대입 연산자: =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=

참고 문서

Java의 정석 - 남궁 성
http://www.tcpschool.com/java/intro

'프로그래밍 > Java' 카테고리의 다른 글

조건문과 반복문  (0) 2021.01.11
인터페이스  (0) 2021.01.09
패키지  (0) 2021.01.02
데이터타입, 변수, 배열  (0) 2020.12.31
상속  (0) 2020.12.26