자바/자바 입문 공부일지

자바 기초 공부 일지 6. 기본 연산자

Tomitom 2022. 10. 25. 12:09
반응형

 

● 산술 연산자

 

사칙연산을 다루는 연산자로, 두 개의 피연산자를 가지는 이항 연산자입니다.

 

출처 : 윤성우의 열혈자바제공 pdf파일

 

우선순위대로 먼저 적용을 하고 그 뒤에 결합방향대로 연산을 합니다. 

결합방향 : 어느 방향으로 연산을 이어가는지에 대한 방향. 우선 순위가 같을 때 적용하는 기준입니다. 

 

기본 처리 순서는 파이썬과 동일하게 곱셈과 나눗셈이 우선하고 그 뒤에 덧셈과 뺄셈이 이루어집니다. 

괄호를 통해 연산자의 처리 순서를 변경할 수도 있습니다. (괄호 우선)

 

● 대입연산자

 

대입연산자는 변수에 값을 대입할 때 사용하는 이항 연산자입니다. 

피연산자는 오른쪽에서 왼쪽으로 대입됩니다. 

 

 

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)
		
	}

}

 

비트 연산자는 로봇 제어, 마이크로프로세서 제어, 펌웨어 프로그래밍 등에 중요하게 쓰입니다. 

우선 연산자는 여기까지! 

반응형