[Java] 03. 연산자


Study/Java  2020. 5. 3. 11:44

안녕하세요. 명월입니다.


이 글은 Java에서 사용되는 연산자에 대한 글입니다.


연산자라는 단어는 말 그대로 계산하는 기호를 뜻합니다. 그 프로그램에서 사용되는 수학적 기호는 우리가 수학 시간에 공부했던 수학 기호와 거의 같습니다.

그래서 프로그램에서 연산 기호로 헤갈리는 경우는 드뭅니다. 그러나 프로그램에서는 좀 더 수학적 기호보다 비트 연산, 논리 연산 기호가 더 추가가 되어 있기 때문에 알아두면 프로그램 작성하는 데 매우 편리합니다.

연산자 사용법 설명
산술 연산자
++ ++a, a++ 값을 하나 증가시킵니다.(전위, 후위 연산자)
-- --a, a-- 값을 하나 감소시킵니다.(전위, 후위 연산자)
+ a + b 더하기
- a - b 빼기
* a * b 곱하기
/ a / b 나누기
% a % b 나머지
관계 연산자
> a > b a가 b보타 크면 true를 반환, 작거나 같으면 false를 반환
>= a >= b a가 b보다 크거나 같으면 true를 반환, 작으면 false를 반환
< a < b a가 b보다 작으면 true를 반환, 크거나 같으면 false를 반환
<= a <= b a가 b보다 작거나 같으면 true를 반환, 크면 false를 반환
== a == b a와 b가 같으면 true를 반환, 다르면 false를 반환
!= a != b a와 b가 다르면 true를 반환, 같으면 true를 반환
비트 연산자
<< a << b 정수 a의 2진수 값을 왼쪽으로 b만큼 이동시키고 나머지는 0으로 채움
>> a >> b 정수 a의 2진수 값을 오른쪽으로 b만큼 이동시키고 나머지를 양수는 0으로 음수는 1로 채움
& a & b a와 b의 and 계산 ex) 4(0100) & 5(0101) = 4(0100)
| a | b a와 b의 or 계산 ex) 4(0100) | 5(0101) = 5(0101)
^ a ^ b a와 b의 xor 계산 ex) 4(0100) ^ 5(0101) = 1(0001)
논리 연산자
&& a && b AND 연산자, 즉 a와 b가 부울 값으로 정의되어 있고 true && true라면 true, true && false 라면 false의 결과를 나타낸다.
|| a || b OR 연산자, 즉 a와 b가 부울 값으로 정의되어 있고 true || true 라면 true, true || fasle 라면 true의 결과를 나타낸다.
대입 연산자
+= a += b a = a + b;와 같은 의미
-= a -= b a = a - b;와 같은 의미
*= a *= b a = a * b;와 같은 의미
/= a /= b a = a / b;와 같은 의미
%= a %= b a = a % b;와 같은 의미
&= a &= b a = a & b;와 같은 의미
|= a |= b a = a | b;와 같은 의미
^= a ^= b a = a ^ b;와 같은 의미
<<= a <<= b a = a << b;와 같은 의미
>>= a >>= b a = a >> b;와 같은 의미
삼항 연산자
? a = b == c ? d : e b와 c가 같으면 a변수에 d의 값을 넣고 b와 c가 다르면 e의 값을 입력

먼저 산술 연산자에서 전위와 후위 연산자의 차이가 있습니다.

a++와 ++a만 쓰고 보면 전위, 후위는 별로 차이는 없습니다만 다른 연산기호가 포함되면 의미가 조금 달라잡니다.

즉, c = b + a++와 c = b + ++a의 차이는 완전히 다른 의미입니다.

public class Test {
  // 실행 함수
  public static void main(String[] args) {
    // 변수 선언
    int a = 1;
    int b = 2;
    int c;
    // ++가 a의 뒤에 있으므로 후위 계산
    // 즉 b + a의 계산 1+2가 c에 3으로 입력이 되고 마지막에 a를 1증가한다.
    c = b + a++;
    // 콘솔 출력
    System.out.println("a = " + a + " b = " + b + " c = " + c);
    // 변수 재선언
    a = 1;
    b = 2;
    // ++가 a의 앞에 있으므로 전위 계산
    // 즉 b + a의 계산 전에 a를 증가 시키고 a가 2가 된 상태의 2+2를 계산해서 c에는 4로 입력한다.
    c = b + ++a;
    System.out.println("a = " + a + " b = " + b + " c = " + c);
  }
}

전위, 후위는 덧셈과 뺼셈만 있습니다. 곱하기 등은 대입 연산자를 통해서 a*=2; 식으로 표현합니다.

그리고 특히 실무에서는 보통 후위로 통일을 하고 최대한 식이 헤갈리지 않는 가독성이 좋은 상태로 프로그램을 작성해야 하기 때문에 위처럼 작성하면 선배한테 혼납니다.. 프로그램은 암호를 만드는게 아니고 모두가 공유 해야 할 업무 프로젝트이기 때문에 편리성이 있어도 가독성을 생각해야 합니다..

public class Test {
  // 실행 함수
  public static void main(String[] args) {
    // 변수 선언
    int a = 1;
    int b = 2;
    int c;
    
    // 가독성으로 후위와 계산식을 같이 넣지 말고 계산하고
    c = b + a;
    // a를 증가하는 식을 넣는 방식으로 가독성을 높힌다.
    a++;
    
    // 콘솔 출력
    System.out.println("a = " + a + " b = " + b + " c = " + c);
  }
}

그리고 비트 연산자는 조금 어려운 개념입니다. 비트 연산자를 사용하는 경우는 거의 flag형식으로 사용하거나 16진수나 8진수를 사용할 때는 이 비트 연산자가 더 편해지기 때문에 사용하는 경우도 있습니다.

public class Test {
  // 실행 함수
  public static void main(String[] args) {
    // 2진수  10진수  16진수
    // 0001  1      0x1
    // 0011  3      0x3
    // 0111  7      0x7
    // 1111  15     0xf
    // a는 0001
    int a = 0x1;
    // b는 1111
    int b = 0xf;
    //  0001 
    // &1111
    //-------
    //  0001
    int c = a & b;
    // c = 1
    System.out.println("c = " + c);
  }
}

public class Test {
  // 실행 함수
  public static void main(String[] args) {
    // 2진수  10진수  16진수
    // 0001 = 1 0x1
    int a = 0x1;
    // 1이 왼쪽으로 1이동
    // 0010 = 2 0x2
    int b = a << 1;
    System.out.println("b = " + b);
    // 1이 오른쪽으로 1이동
    // 0000 = 0 = 0x0;
    int c = a >> 1;
    System.out.println("c = " + c);
    // 0010 XOR 0000 = 0010
    int d = b ^ c;
    System.out.println("d = " + d);
  }
}

이 비트 연산자가 안 쓰일꺼 같은데 flag형식에서 정말 많이 쓰입니다. 알아두면은 굉장히 편해지는 연산자입니다.

public class Test {
  // 실행 함수
  public static void main(String[] args) {
    // 사실 변수를 한글로 사용하면 안됩니다!
    // 0x1 = 0001
    int 빨래 = 0x1;
    // 0x2 = 0010
    int 청소 = 0x2;
    // 0x4 = 0100
    int 설겆이 = 0x4;
    // 0x8 = 1000
    int 공부 = 0x8;
    // people은 빨래와 청소를 했습니다.
    // 0001 | 0100 = 0101
    int people = 빨래 | 청소;
    // 빨래했는지 확인 제어문
    if ((빨래 & people) == 빨래) {
      // 콘솔 출력
      System.out.println("빨래 함");
    }
    // 청소했는지 확인 제어문
    if ((청소 & people) == 청소) {
      // 콘솔 출력
      System.out.println("청소 함");
    }
    // 설겆이했는지 확인 제어문
    if ((설겆이 & people) == 설겆이) {
      // 콘솔 출력
      System.out.println("설겆이 함");
    }
    // 공부했는지 확인 제어문
    if ((공부 & people) == 공부) {
      // 콘솔 출력
      System.out.println("공부 함");
    }
  }
}

위처럼 변수를 여러개 할 필요없이 하나의 변수 16진수로 4개의 정보를 넣을 수 있습니다. 빨래를 했는지 청소를 했는지 말입니다.

이런 식으로 비트 연산자는 매우 많이 사용하기 때문에 알아두면 매우 좋을 것입니다.


여기까지 Java에서 사용되는 연산자에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.