[JAVA] 자바 연산자 알아보기 1

    728x90

    안녕하세요

    로로봉입니다 : )

    오늘은 JAVA 연산자에 대해 알아보도록 하겠습니다.

    연산자(operator)는 프로그래밍 언어에서 가장 기본적이면서도 중요한 요소입니다.

    각 연산자의 특징과 우선순위에 대해 잘 알아두어야 JAVA 프로그래밍에 어려움이 없을 것 입니다.

    구분 연산 방향 연산자 종류
    단항 연산자 왼쪽 ++ -- + - ~ ! (타입)
    산술 연산자 오른쪽 * / %
    + -
    << >> >>>
    비교 연산자 오른쪽 < > <= >= instanceof
    == !=
    논리 연산자 오른쪽 & ^ | && ||
    삼항 연산자 오른쪽 ?:
    대입 연산자 왼쪽 = *= /= %= += -= <<= >>= >>>= &= ^= |=

     위에 표에서 같은 줄에 있는 연산자들은 우선순위가 같습니다.

    단항 연산자부터 우선순위가 가장 높고 대입 연산자는 우선순위가 가장 낮습니다.

    동일한 우선수위를 가진 연산자의 경우 연산 방향에 따라 순서가 정해집니다.

    JAVA에서 연산자에 대해 기억해야 할 것은 아래와 같습니다.

    1) 산술 > 비교 > 논리 > 대입 순서로 우선순위가 높다.
    2) 단항(1) > 이항(2) > 삼항(3) 순서로 우선순위가 높다.
    3) 단항 연선자와 대입 연산자를 제외한 모든 연산자의 연산방향은 왼쪽에서 오른쪽 순서이다.

     

     


    1. 단항 연산자

    1) 증감 연산자 ( ++,  -- )

     일반적으로 단항 연산자는 피연산자의 왼쪽에 위치하지만, 증감 연산자는 양쪽 모두 가능합니다. 연산자를 어느 위치에 놓는가에 따라서 연산결과가 달라질 수 있습니다.

    증가 연산자(++) : 값을 1 증가시킨다.
    감소 연산자(--) : 값을 1 감소시킨다.

     boolean형을 제외한 모든 기본형 변수에 사용이 가능하며, 피연산자의 왼쪽에 위치하면 전위형, 우측에 위치하면 후위형으로 불립니다.

    int i = 3;
    int j = 0;
    j = i++;
    System.out.println("i = " + i + ", j = " + j);
    
    i = 3;
    j = 0;
    j = ++i;
    System.out.println("i = " + i + ", j = " + j);

    위 코드를 실행하면 아래와 같은 결과를 볼 수 있습니다.

    i = 4, j = 3
    i = 4, j = 4

    i의 값은 어느 경우에나 1이 증가되어 4가 되지만 j의 경우 전위형과 후위형의 결과가 다르게 저장되는 것을 볼 수 있습니다.

    전위형은 변수의 값을 먼저 증가시킨 후 대입시키고, 후위형의 경우 변수를 대입 시킨 후에 값을 증가시키는 것을 볼 수 있습니다.

    증감연산자가 i++; 와 같이 단독으로 사용되는 경우에는 전위형 후위형 상관 없이 i 값을 증가시키기 때문에 차이가 없습니다.

    2) 부호 연산자 ( +, - )

    부호 연산자는 변수의 부호를 변경하는데 사용됩니다. boolean형과 char형을 제외한 나머지 기본형에 사용할 수 있습니다.

    부호 연산자 '+'의 경우에는 변수에 +1을 곱한 결과와 마찬가지이며, '-'의 경우 변수에 -1을 곱한 결과를 얻습니다.

    int i = -90;
    i = +i;
    System.out.println(i);
    
    i = -90;
    i = -i;
    System.out.println(i);

     위 코드를 실행하면 아래와 같은 결과를 볼 수 있습니다.

    -90
    90

     -90 x +1 = -90 결과와 -90 x -1 = 90 의 결과를 얻을 수 있습니다.


    3) 비트전환 연산자 ( ~ )

     비트전환 연산자는 정수형과 char형에만 사용할 수 있으며, 변수를 2진수로 표현 했을 때, 0은 1로 1은 0으로 바꾸게 됩니다.

    비트전환이 되면 부호비트도 변경되기 때문에 양수는 음수로 음수는 양수로 변환됩니다.

    비트전환에 대해 알기 위해선 1의 보수 및 2의 보수의 개념을 알아야 합니다.

    1의 보수의 경우 2진수로 표현된 데이터를 0에서 1로 1에서 0으로 변경하는 것을 말합니다.

    변경된 데이터에서 1을 더해주면 2의 보수가 됩니다.

    byte b = 10;
    System.out.println("b = " + b);
    System.out.println("~b = " + ~b);
    System.out.println("~b+1 = " + (~b+1));

    위의 코드를 실행하면 아래와 같은 결과를 볼 수 있습니다.

    b = 10
    ~b = -11
    ~b+1 = -10

    비트전환 연산자를 사용하면 1의 보수로 비트가 변경되는 것을 볼 수 있습니다.

    10진수 2진수
    10 00001010
    -11(1의 보수) 11110101
    -10(2의 보수) 11110110

    4) 논리부정 연산자 ( ! )

     논리부정 연산자는 boolean형에만 사용할 수 있습니다. true는 false로 false는 true로 변경합니다.

    boolean flag = false;
    System.out.println(flag);
    flag = !flag;
    System.out.println(flag);
    flag = !flag;
    System.out.println(flag);

    위의 코드를 실행하면 아래와 같은 결과를 볼 수 있습니다.

    false
    true
    false

     

     


    2. 산술 연산자

     사직 연산자, 나머지 연산자, 쉬프트 연산자는 모두 두개의 변수를 연산하는 이항 연산자입니다.

    이항 연산자는 변수의 크기가 4byte보다 작으면 4byte(int형)으로 변환한 다음에 연산을 수행합니다.

    이항 연산을 수행하기 전에 변수들의 타입을 일치하는 사실도 중요합니다.

    모든 이항 연산자는 연산을 수행하기 전에
     - 크기가 4byte이하인 자료형을 int형으로 변환한다. (byte, char, short > int)
     - 변수의 타입을 서로 일치시킨다.

    1) 사칙 연산자 ( +, -, *, / )

    사칙 연산은 이미 대부분이 알고 계신대로 곱셈, 나눗셈, 나머지 연산자가 덧셈, 뺄셈 연산자보다 우선순위가 높습니다.

    int형(4byte)보다 크기가 작은 자료형은 int형으로 변환한 후에 연산을 수행한다.
    두 개의 변수 중 자료형의 표현범위가 큰 쪽에 맞춰서 형변환 된 후 연산을 수행한다.
    정수형 간의 나눗셈에서 0으로 나누는 것은 금지되어 있다.

    byte를 사칙 연산하게 되면 int형으로 변환되기 때문에 명시적으로 형변환이 필요합니다.

    byte a = 10;
    byte b = 20;
    byte c = (byte)(a + b);

    2) 나머지 연산자 ( % )

    나머지 연산자는 왼쪽의 변수를 오른쪽 변수로 나누고 난 나머지 값을 반환하는 연산자입니다.

    boolean 형을 제외하고는 모든 기본형 변수에 사용할 수 있습니다. 나머지 연산자는 주로 짝수, 홀수 또는 배수 검사 등에 주로 사용됩니다.

    int data1 = 10 / 3;
    int data2 = 10 % 3;
    System.out.println("10을 3으로 나누면 몫은 " + data1 + " / 나머지는 " + data2 + " 입니다.");

    위의 코드를 실행하면 아래와 같은 결과를 볼 수 있습니다.

    10을 3으로 나누면 몫은 3 / 나머지는 1 입니다.

    음수로 나머지 연산자를 사용하는 경우 왼쪽에 나눠지는 변수의 부호를 따르게 됩니다.

    부호를 무시하고 나머지 연산을 한 후 왼쪽 변수의 부호를 붙이면 됩니다.

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

    쉬프트 연산자는 정수형 변수에만 사용할 수 있습니다.

    변수를 2진수로 표현했을 때 각 자리를 오른쪽이나 왼쪽으로 이동하는 연산자입니다.

    오른쪽으로 n자리를 이동하면 변수를 2ⁿ로 나눈 것과 같고, 왼쪽으로 n자리를 이동하면 2ⁿ으로 곱한 것과 같은 결과를 얻을 수 있습니다.

    x << n 은 x * 2ⁿ 의 결과와 같다.
    x >> n 은 x / 2ⁿ 의 결과와 같다.

    << 왼쪽 쉬프트의 경우 변수의 부호와 관계없이 오른쪽 빈칸을 0으로 채우게 됩니다.

    >> 우측 쉬프트의 경우 음수인 경우 부호를 유지하기 위해 왼쪽 빈칸을 1로 채우게 됩니다.

    좌측의 빈칸을 0으로 채우고자 할 경우 >>> 쉬프트 연산자를 사용하면 됩니다.

    쉬프트 연산자를 사용하는 이유는 속도때문입니다.

    가독성은 곱셈이나 나눗셈보다 떨어지기 때문에 일반적인 상황이라면 곱셈과 나눗셈을 사용하고, 빠른 처리가 필요한 경우 쉬프트 연산자를 사용하시면 됩니다.

    10 / 2 와 같은 처리를 10 >> 1 처리와 동일하며, 속도면에서는 훨씬 빠른 처리가 이뤄진다고 보시면 됩니다.


     

    좋아요 ♥ + 구독부탁드립니다. : )

    728x90
    반응형

    댓글