● 산술 연산자
사칙연산을 다루는 연산자로, 두 개의 피연산자를 가지는 이항 연산자입니다.
우선순위대로 먼저 적용을 하고 그 뒤에 결합방향대로 연산을 합니다.
결합방향 : 어느 방향으로 연산을 이어가는지에 대한 방향. 우선 순위가 같을 때 적용하는 기준입니다.
기본 처리 순서는 파이썬과 동일하게 곱셈과 나눗셈이 우선하고 그 뒤에 덧셈과 뺄셈이 이루어집니다.
괄호를 통해 연산자의 처리 순서를 변경할 수도 있습니다. (괄호 우선)
● 대입연산자
대입연산자는 변수에 값을 대입할 때 사용하는 이항 연산자입니다.
피연산자는 오른쪽에서 왼쪽으로 대입됩니다.
and -> &&
or -> ||
not -> ! 단항연산자
주의할 점은 복합대입연산이 한 줄에 두 개 이상 쓰이면 하나만 대입됩니다.
가장 앞에 있는 대입연산의 결과가 출력되고 그 뒤에 후술된 연산은 적용되지 않습니다.
● 증감연산자
증감연산자는 증가 혹은 감소한 값을 피연산자에 저장해주는 연산자입니다.
수를 1씩 증가 또는 감소 시키며, 피연산자의 앞 혹은 뒤에 붙일 수 있습니다.
++ 피연산자에 저장된 값을 1증가
ex) ++num (num 변수에 1 더하고 저장)
-- 피연산자에 저장된 값을 1감소
ex) --num (num 변수에 1 빼고 저장)
증감연산자가 앞에 붙는 경우 prefix 프리픽스 = 전위 증감 , 전위 감소 (증감을 즉각 반영 후 진행)
증감연산자가 뒤에 붙는 경우 postfix 포스트픽스 = 후위 증감 , 후위 감소 (다음 명령문부터 증감 반영)
package day12;
public class Test {
public static void main(String[] args) {
//증감연산자 ( ++ , --)
int num = 10;
num ++; // num += 1
// postfix :선 처리 후 연산
System.out.println(num);
++num; // // prefix : 선 연산 후 처리
// 연산이 반복적으로 처리 될 때에는 포스트픽스와 프리픽스의 연산 결과 값은 같다.
System.out.println(num);
System.out.println(++num); // prefix는 연산을 한 뒤에 출력을 합니다.
System.out.println(num++); // postfix는 출력을 한 뒤에 연산값이 저장이 됩니다.
System.out.println(num);
}
}
증감연산자는 프리 픽스인지 포스트 픽스인지에 따라 저장되고 출력되는 결과값이 다릅니다.
이 경우 이중 연산을 할 때 차이점이 확실하게 드러나니 아래 예제를 참조해주세요.
package day12;
public class Test {
public static void main(String[] args) {
//증감연산자 ( ++ , --)
int num = 10;
System.out.println((num++)+ " "); // 10을 출력 한 뒤에 결과 값 1 더하기
System.out.println((num++)+ " "); // 11을 출력 한 뒤에 결과 값 1 더하기
System.out.println( num + "\n"); // 결과값 12
System.out.println((num++) * 10); // 12에 10을 곱한 뒤에 1을 더하기
System.out.println((++num) * 10); // 13에 1을 더한 뒤에 10 곱하기
System.out.println(num); // 결과값 14
}
}
곱셈이 함께 있을 경우에 증감연산자의 처리 후 * 10이 되며 출력물이 달라집니다.
● 비트 연산자
0 0 0 0 0 0 0 0 의 비트를 대상으로 연산을 진행합니다.
음수와 양수에 따라 연산의 값이 달라지는데 이렇게 수에 가장 큰 영향을 미치는 비트인
가장 왼쪽의 비트를 MSB (Most Significant Bit)라고 부르고
가장 오른쪽의 비트를 LSB (Least Significant Bit) 라고 부릅니다.
연산자는 and, or, not, 반전 이렇게 네 가지의 역할이 있습니다.
○ and 역할을 하는 연산자는 & -> 비트 단위로 and 연산을 해서 둘 다 같을 경우에 같은 값을 출력합니다.
○ or 역할을 하는 연산자는 | (엔터 위의 달러 표시에서 쉬프트를 누르면 나오는 기호) -> 비트 단위로 or 연산을 해서 둘 중 하나가 1일 경우에 1의 값을 출력합니다.
○ not( Xor) 역할을 하는 연산자는 ^ -> 비트 단위로 두개의 값이 같지 않을 때에만 1의 값을 출력합니다.
○ 반전 역할을 하는 연산자는 ~ -> 모든 비트를 반전시켜서 얻은 결과를 출력합니다.
숫자 5와 숫자 3을 바이트 (2진수)로 바꾼 뒤 연산을 해보겠습니다.
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | (5) |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | (3) |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | (-1) |
5 & 3 (두 개의 값이 모두 1일 경우에만 1을 출력) = 1
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
5 | 3 (두 개의 값 중 하나만 1일 경우에도 1을 출력) = 7
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
5 ^ 3 (두 개의 값이 같지 않을 경우에만 1을 출력) = 6
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
~ -1 (모든 비트 반전) = 0
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
비트 연산자는 주로 기계제어를 할 때 많이 사용 됩니다.
● 비트 쉬프트 연산자
<< : 피연산자의 비트 열을 왼쪽으로 이동 (빈 공간은 0으로 채움)
>> : 피연산자의 비트열을 오른쪽으로 이동 (빈 공간은 음수의 경우 1, 양수의 경우 0으로 채움)
>>> : 피연산자의 비트열을 오른쪽으로 이동 (빈 공간은 0 으로 채움)
byte n = 00001000 (8) 의 경우로 보겠습니다.
n << 2 -> 비트 단위로 앞으로 두 칸을 이동합니다. (앞의 두 칸이 잘립니다. 메모리 영역 밖으로 벗어나므로 소실됩니다.)
n = 00100000 (32) 로 증가 됩니다.
byte a = 00100010 (34)의 경우로 보겠습니다.
a >> 1
a = 00010001 (17) 로 감소됩니다.
byte c = 10010001 (-111)의 경우로 보겠습니다.
(음의 2진수의 값을 구하는 법 : 2의 보수를 취하고 맨 끝자리에 1을 더합니다. 01101111 -> 111 이므로 반전한 값은 -111 )
c >>2
c = 11100100
package day12;
public class Test02 {
public static void main(String[] args) {
byte num;
byte number;
num = 9; // 00001001
System.out.println((byte)(num << 1) + " "); // 00010010 18
System.out.println((byte)(num << 4) + " "); //10010000 -112
System.out.println((byte)(num >> 3) + " "); // 00000001 1
number = -3; // 11111101
System.out.println((byte)(number >> 1) + " "); // 1111 1110 (-2)
}
}
비트 연산자는 로봇 제어, 마이크로프로세서 제어, 펌웨어 프로그래밍 등에 중요하게 쓰입니다.
우선 연산자는 여기까지!
'자바 > 자바 입문 공부일지' 카테고리의 다른 글
자바 기초 공부 일지 8. 반복문 while문, for문, break와 continue, 중첩 반복문 (0) | 2022.10.25 |
---|---|
자바 기초 공부 일지 7. 조건문 조건제어 if문, else, else if, switch문, break문 과일 바구니 예제 문제 (0) | 2022.10.25 |
자바 기초 공부 일지 5. 상수 (리터럴), 자료형 변환 (0) | 2022.10.24 |
자바 기초 공부 일지 4. 자료형 (정수형, 문자형) (258) | 2022.10.24 |
자바 기초 공부 일지 3. 자바 변수 선언하기, 정수의 표현 방법(2진법 표현식) (0) | 2022.10.24 |