Java 연산자

LIM JAEHO·2022년 6월 29일
0

Java 학습

목록 보기
6/19

항과 연산자

  • : 연산에 사용되는 피연산자
  • 연산자 : 항을 연산을 시키는 기호

연산자의 종류

항의 개수에 따른 분류

  • 단항 : 1개 항을 연산
  • 이항 : 2개 항을 연산
  • 삼항 : 3개 항을 연산

기능에 따른 분류

  • 할당연산자
    말 그대로 값을 할당(대입)해주는 연산자
    • =
  • 산술 연산자
    수학적인 연산을 해주는 연산자
    • +
    • -
    • *
    • /
    • %
  • 증감 연산자
    값을 1씩 증가와 감소시켜주는 연산자
    • ++
    • --
  • 복합 대입 연산자
    할당 연산자와 산술 연산자의 조합으로 사용
    • +=, -=, ...
  • 비교 연산자
    값을 비교해주는 연산자로 boolean 값을 return 해준다.
    • <, >
    • ==, !=
    • <=, >=
  • 논리 연산자
    • &&
    • ||
  • 비트 연산자
    2진수를 다루는 비트 연산을 시켜주는 연산자
    • <<
    • >>
    • >>>
    • &
    • |
    • ^
    • ~
  • 삼항 연산자
    • (조건식) ? "참일 때 return 값" : "거짓일 때 return 값"

위 연산자들을 하나하나 다 외운다는 느낌보다는 코드에 익숙해지고 실제로 사용하는 데에 집중하자.
자연스레 손에 익게 될 것이다.

비트 연산

2진법

2를 기준으로 수를 다루는 방식으로 컴퓨터에서 데이터를 다루는 방식이기도 하다.

2의 보수

보수를 계산하는 방법은 N진수에서 m 자리의 n 이라는 수가 있을 때,
N^(m+1) - n 의 값이 보수이다.

예를 들어,

  • 10진수 3 의 보수는 10 - 3 = 7 이다.
  • 2진수 11 의 보수는 100 - 11 = 01 이다.

참고로 컴퓨터에서 음수는 2의 보수와 같다.
컴퓨터에서 수를 표현하는 비트는 부호비트 | 001 과 같이 이뤄져있다.
예를 들어 4개의 비트만을 사용할 수 있는 컴퓨터가 있다고 해보자.

  • 0001 은 숫자 1을 나타낸다.
  • 0001 의 보수인 1111 은 숫자 -1을 나타낸다.
  • 1 + (-1) 을 2진수로 나타내면 0001 + 1111 = 10000 인데 10000 에서 1은 사용할 수 있는 비트를 초과하기 때문에, 사실상 0001 + 1111 = 0000 을 의미하고, 00000이다.

2의 보수 쉽게 구하기

2진수의 보수를 쉽게 구하는 방법은 모든 자리의 수를 반전시킨 뒤에 +1 해주면 된다.
예를 들어,

  • 2진수 1011 의 보수는 0100 + 0001 = 0101 이다.

비트 연산자

비트 연산자

System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(5)));			// 0101 
System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(3)));			// 0011

/* & AND */
System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(5 & 3)));		// 0001

/* | OR */
System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(5 | 3)));		// 0111

/* ^ XOR */
System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(5 ^ 3)));		// 0110

/* ~ NOT */
System.out.printf("%s\n", Integer.toBinaryString(~5));		// 1010

비트 이동연산자

  • <<
    • 는 모든 비트를 왼쪽으로 옮겨주고, 곱하기 2^n 와 같은 결과를 가져온다.
    • 부호비트는 유지되지 않는다.
  • >>
    • 모든 비트를 오른쪽으로 옮겨주고, 나누기 2^n 와 같은 결과를 가져온다.
    • 부호비트는 무조건 그대로 유지된다.
  • >>>
    • >> 와 같이 모든 비트를 오른쪽으로 옮겨준다.
    • 가장 오른쪽 bit 즉, 부호 비트를 무조건 0 으로 바꿔준다.
/* << left shift */
System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(5)));			// 0101
System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(5 << 1)));		// 1010	
System.out.println(5 << 1);															// 10

/* >> right shift */
System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(5 >> 1)));		// 0010	
System.out.printf(5 >> 1);															// 2

/* >>> right shift and assign 0 at MSB (Most Significant Bit) */
System.out.printf("%s\n", Integer.toBinaryString(-5 >> 1));							// 11111111111111111111111111111101
System.out.println(-5 >> 1);														// -3

System.out.printf("%04d\n", Integer.parseInt(Integer.toBinaryString(-5 >>> 1)));	// 01111111111111111111111111111101
System.out.println(-5 >>> 1);														// 2147483645

연산자의 종류 에 대해 더 자세히 알고 싶다면, 링크로 들어가보자.

0개의 댓글