Java Study #3

allzeroyou·2022년 1월 24일
0

Java

목록 보기
3/14
post-thumbnail

1. 연산자의 종류

자바의 연산자는 연산 결과의 특징에 따라 3가지로 나눌 수 있다. 첫째, 연산 결과가 특정 값이 나오는 산술, 비트, 시프트 연산자 둘째, 연산 결과가 참과 거짓 중 하나의 값으로만 나오는 비교, 논리 연산자 마지막으로 값을 반환하는 것이 아닌 값을 대입하는 의미를 지니고 있는 대입 연산자삼항 연산자가 있다.


출처: https://m.blog.naver.com/29java/70188119123

2. 연산자의 연산 방법

2-1. 산술 연산자와 증감 연산자

산술 연산자는 사칙 연산(+, -, *, /)나머지 연산(%) 이 있다. 이 중 정수 / 정수 형태의 나누기를 할 때 주의해야 하는데, int / int = int 이므로 5 / 2의 값은 2.5가 아니라 2 이다. 즉, 정수 / 정수의 결과는 나눗셈의 몫과 같다!

증감 연산자(++, --)는 변숫값을 1씩 증가 또는 감소 시킨다. 예를 들어 a++ 의 의미는 a = a + 1라는 뜻으로 현재 a의 값을 1 증가시켜 다시 변수 a에 저장하라는 의미이다.
증감연산자는 전위형후위형 으로 나뉘는데 차이점은 실행의 우선순위이다! 전위형은 모든 명령보다 먼저 실행되고 후위형은 가장 나중에 실행된다.

전위형, 후위형 증감 연산자가 동일한 결과를 출력할 때

int a = 3;
++a; // a 값에 1을 더하라는 명령 1개(전위형, 후위형 차이 x)
System.out.println(a); // 4

int b = 3;
b++; // b 값에 1을 더하라는 명령 1개(전위형, 후위형 차이 x)
System.out.println(b); // 4

전위형, 후위형 증감 연산자가 서로 다른 결과를 출력할 때

int a1 =3;
int b1 = ++a1;

System.out.println(a1); // 4
System.out.println(b1); // 4

int a2 = 3;
int b2 = a2++;

System.out.println(a2); //4
System.out.println(b2); //3

2-2. 비트 연산자

비트 단위의 연산자로, AND(&), OR(|), XOR(^), NOT(~) 이 있다.
비트 AND(&)는 두 값이 모두 1일 때만 1인 연산자, 비트 OR(|)은 두 값이 모두 0일 때만 0인 연산자이다. 비트 XOR(^)은 두 값이 같을 때 0, 다를 때 1의 값을 가지고 비트 NOT(~)은 0은 1, 1은 0으로 표현하는 연산자이다.

비트 AND, 비트 OR, 비트 XOR 연산 과정

비트 단위의 연산을 직접 계산하기 위해서는 10진수를 비트 단위의 표현 방식인 2진수로 바꿔 표기할 수 있어야 한다.
자바는 코드상으로 10진수를 2진수, 8진수, 16진수로 변환하는 메서드와 이를 다시 10진수로 변환하는 메서드를 활용할 수 있다!

비트 AND 연산의 예

System.out.println(3 & 10); // 2
System.out.println(0b00000011 & 0b00001010); // 2
System.out.println(0x03 & 0x0A); // 2

비트 OR 연산의 예

System.out.println(3 | 10); // 11
System.out.println(0b00000011 | 0b00001010); // 11
System.out.println(0x03 | 0x0A); // 11

비트 XOR 연산의 예

System.out.println(3 ^ 10); // 9
System.out.println(0b00000011 ^ 0b00001010); // 9
System.out.println(0x03 ^ 0x0A); // 9

비트 NOT 연산 과정

비트 NOT 연산자를 이해하기 위해서는 우선 양숫값음숫값을 읽는 방법을 알아야 한다. 값의 첫 번째 비트부호 비트(0: 양수, 1: 음수) 로 숫자의 부호를 결정한다!
일단 부호가 결정되면 나머지 비트로 값을 읽으면 된다. 양수는 1을 기준으로 값을 읽고 음수는 0을 기준으로 값을 읽은 후 1을 더한 값이 음수의 절댓값이다.

  • 예를 들어 2진수 00..01010은 양수이므로 1을 기준으로 읽는다. 2^3+2^1이므로 +10을 의미한다.
  • 11..11010은 음수이므로 0을 기준으로 읽는다.
    2^2+2^0이므로 -6을 의미한다.

NOT 연산자는 0과 1을 반전시키는 연산으로, 부호 비트까지 반전시키므로 비트 NOT 연산을 수행하면 항상 부호가 바뀌게 된다!

비트 NOT 연산의 예

System.out.println(~3); // -4
System.out.println(~0b00000011); // -4
System.out.println(~0x03); // -4

System.out.println(~0); // -1
System.out.println(~0b00000000); // -1
System.out.println(~0x00); // -1

2-3. 시프트 연산자

비트의 위치를 좌우로 이동하는 연산으로 산술 시프트(<<, >>)논리 시프트(>>>)가 있다.

산술 시프트

산술 시프트는 숫자의 부호 비트는 유지 하되 나머지 비트를 왼쪽(<<) 또는 오른쪽(>>)으로 이동하는 연산자이다.

  • << 연산을 수행하면 부호 비트를 제외한 나머지 전체 비트가 왼쪽으로 이동하므로 1 bit 이동할 때마다 x 2의 효과가 있다.
  • 반면, >> 연산을 수행하면 부호 비트를 제외한 나머지 비트가 오른쪽으로 이동하므로 1 bit 이동할 때마다 ÷ 2의 효과가 있다.
  • 여기서 주의해야 할 점은 이동한 이후 발생하는 빈칸이다. 빈칸을 채우는 방식은 시프트 방향에 따라 다른데, << 연산일 때는 빈칸이 오른쪽에 생기며 이때는 부호 비트 값과 동일한 값으로 채운다! >> 연산일때는 삭제되는 비트 때문에 값을 2로 나눈 결과와 다르게 나타날 수 있다.
  • 예를 들면 0b0011 >> 1을 연산하면 1.5가 아닌 1의 값이 나타나는데 이때 발생하는 오차는 0b0011의 최하위 비트 값이 시프트 과정에서 삭제되기 때문이다!

논리 시프트

논리 시프트는 숫자의 부호 비트를 포함해 전체 비트를 오른쪽으로 이동하시키는 연산으로, 빈칸은 모두 0으로 채운다. 부호 비트까지 이동시키므로 부호 비트가 1인 음수일 때는 논리 시프트 이후로 값이 양수로 변할 것이다.

2-4. 논리 연산자

논리 연산자는 비트 연산자와 비슷하지만, 피연산자로 오직 boolean 값만이 올 수 있다. 연산 결과 또한 boolean 타입만을 가진다. 논리 AND(&&)는 두 값이 모두 true일 때만 true이고, 나머지는 모두 false의 값을 가진다. 논리 OR(||)은 두 값이 모두 false 일때만 false이며, 나머지 경우는 모두 true이다. 논리 XOR(^)은 두 값이 다를 때는 true, 두 값이 같을 때는 false 의 연산결과를 나타나며, 논리 NOT(!)은 true와 false의 값을 반전시키는 연산자이다.

2-5. 대입 연산자

대입 연산자(=)는 오른쪽 피연산자의 연산 결과를 왼쪽 변수에 대입하는 연산자로, 수학에서 배운 등호(=)와 생김새는 똑같지만 의미하는 것이 전혀 다르므로 주의한다.

  • 대입 연산자는 다른 연산자와 결합해 축약된 형태로 사용될 수 있다. 예를 들어 a = a+ba+=b 로 축약해서 표현할 수 있다.

2-6. 삼항 연산자

자바 연산자 중 유일하게 3개의 피연산자가 있는 연산자이다.

삼항 연산자의 구성
(참 또는 거짓) ? 참일 때 연산 결과 : 거짓일 때 연산결과

삼항 연산자의 간단한 예

int a = (true) ? 1 : 2; //true 이므로 1 출력
System.out.println(a); // 1

int b = (a % 2 == 0) ? 10 : 20; //false이므로 20 출력
System.out.println(b); // 20

📕 참고문헌) Do it! 자바 완전 정복!

profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글