본문 바로가기

Java

3-2장 연산자의 연산 방법

1. 산술 연산자와 증감 연산자 
 
 1) 산술 연산자 
   - 나머지 연산자(%) = 모듈로(modulo)연산 = 나머지를 수행한 이후의 나머지 
   
 2) 증감 연산자 
 - 전위형
  - 변수 앞에 붙음
  - 다른 모든 명령보다 먼저 실행
 
 - 후위형
  -변수 뒤에 붙음
  - 가장 나중에 실행
 
- 전위형, 후위형 증감 연산자가 동일한 결과를 출력할 때

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

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

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

int a1 =3;
int b1=++a1; //a1 값에 1을 더하기 (전위형) -> a1 값을 b1 값에 대입
System.out.println(a1); //4
System.out.println(b1); //4

int a2=3;
int b2=a2++; //a2 값을 b2에 대입 -> a2값에 1을 더하기 (후위형)
System.out.println(a2); //4
System.out.println(b2); //3

  -전위형 : 증감 연산을 먼저 실행 후 대입 연산 수행
  - 후위형 : 대입연산을 먼저 수행 후 증감 연산 실행
 
- 산술 연산자와 3가지 증감 연산자 

package operator_EX;

public class operator_EX1 {
	public static void main(String[] args ) {
		//산술 연산자 
		System.out.println(2+3);
		System.out.println(8-5);
		System.out.println(7*2);
		System.out.println(7/2);
		System.out.println(8%5);
		System.out.println();
		
		//증감 연산자 case1
		int value1=3;
		value1++;
		System.out.println(value1);
		
		int value2=3;
		value2++;
		System.out.println(value2);
		
		//증감 연산자 case2
		int value3=3;
		int value4=value3++; 
		System.out.println(value3);
		System.out.println(value4);
		System.out.println();
		
		int value5=3;
		int value6=++value5;
		System.out.println(value5);
		System.out.println(value6);
		System.out.println();
		
		//증감 연산자 case3
		int value7=3;
		int value8=4;
		int value9=2+value7-- + ++value8;
		System.out.println(value7);
		System.out.println(value8);
		System.out.println(value9);
		
	}
}

 
2. 비트 연산자 
 
 - 비트 단위의 연산자 
 - 진리표

값1값2AND(&)OR(|)XOR(^)
00000
01011
10011
11110

 

NOT(~)
  
1
10
  

- 10진수 -> 2진수 : Integer.toBinaryString()
- 10진수 -> 8진수: Integer.toOctalString()
- 10진수 -> 16진수: Integer.toHexString()
- 다시 10진수로 : Integer.parseInt()
 
- 비트 NOT 연산 과정 
 - 값의 첫번째 비트는 부호비트(0:양수, 1:음수) 
 - 부호가 정해지면 나머지 비트로 값 읽기 (양수는 1을 기준으로, 음수는 0을 기준으로 읽은 후에 1 더하기 )
 
3. 시프트 연산자 
 
 - 비트 위치를 좌우로 이동하는 연산
 - 산술시프트(<< >>)/ 논리 시프트(>>>)
 
 1) 산술 시프트 
  - 숫자의 부호 비트는 유지 하면서 나머지 비트를 왼쪽(<<) 또는 오른쪽(>>)으로 이동시킴
 
  - 왼쪽(<<)
   - 1bit 이동할 때 마다 X2의 효과 
   - 오른 쪽 빈칸생김
   - 0으로 채움
 
  - 오른쪽(<<)
   -1bit 이동할 때 마다 %2효과 
   - 왼쪽 빈칸 생김
   - 부호비트와 동일한 값으로 채움
 
 2) 논리 시프트
  - 부호 비트를 포함해 전체 비트를 오른쪽으로 이동
  - 빈칸은 모두 0으로 채움
  - 부호 비트까지 이동시키므로 부호 비트가 1인 음수일때 논리 시프트 이후에는 값이 양수로 변함
  - 각 비트 위치에서 값만이 의미가 있을때 사용  
   ex) '3번째 비트는 사운드 on/off 여부를 나타내고, 4번째 비트 위치는 자동완성 on/off를 의미'
 
  - 논리 시프트를 이용해 각 비트 위치에서의 값 알아내기 

int flags = 0b10110110;
System.out.println(flags >>> 0 & 1); //0: 0번째 비트값
System.out.println(flags >>> 1 & 1); //1: 1번째 비트값
System.out.println(flags >>> 2 & 1); //1: 2번째 비트값
System.out.println(flags >>> 3 & 1); //0: 3번째 비트값
System.out.println(flags >>> 4 & 1); //1: 4번째 비트값
System.out.println(flags >>> 5 & 1); //1: 5번째 비트값
System.out.println(flags >>> 6 & 1); //0: 6번째 비트값
System.out.println(flags >>> 7 & 1); //1: 7번째 비트값

 
4. 비교 연산자 
 
 - 크기 비교(>,<,>=,<=) 와 등가 비교(==,!=)
 - 등가 비교 비교 대상 = 스택(Stack)메모리의 값을 비교 
 - 기본 자료형의 실제 데이터 값은 스택 메모리에 저장
 - 참조 자료형의 실제 데이터 값은 힙 메모리에 저장되고 스택 메모리에는 실제 데이터 값의 위칫값 저장
 - 기본 자료형 등가 비교 대상 = 실제 데이터 값
 - 참조 자료형 등가 비교 대상 = 실제 데이터 값이 위치한 번짓값
 
- 크기 비교 및 등가 비교와 참조 자료형의 등가 비교 

package operator_EX;

public class operator_EX2 {
	public static void main(String[] args) {
		//크기 비교
		System.out.println(5<2);
		System.out.println(5>2);
		System.out.println(5<5);
		System.out.println(5<=5);
		System.out.println(5>=5);
		System.out.println();
		
		//등가 비교 
		//기본 자료형 등가 비교 
		int a =5;
		int b =2;
		int c= 5;
		System.out.println(a==b);
		System.out.println(a!=b);
		System.out.println(a==c);
		System.out.println(a!=c);
		System.out.println();
		
		//참조 자료형 등가 비교 
		String str1 = new String("안녕");
		String str2 = new String("안녕");
		System.out.println(str1==str2); 
	}
}

 
5. 논리 연산자 
 
 - 비트 연산자와 비슷하지만 피연산자로 불리언값(true, false)만 올수 있고 연산 결과 또한 불리언값만 올수 있음
 - 진리표 

값1값2AND(&&)OR(||)XOR(^)
falsefalsefalsefalsefalse
falsetruefalsetruetrue
truefalsefalsetruetrue
truetruetruetruefalse
NOT(~)
  
falsetrue
truefalse
  

 
- 논리 연산은 비트 연산자로도 수행할 수 있음
- 차이점은 쇼트 서킷의 적용여부(논리연산은 적용 /비트 연산은 비적용)
- 쇼트 서킷(short circuit)
 - 연산을 수행하는 과정에서 결과가 이미 확정됐을 때 나머지 연산과정을 생략하는 것
 
- 논리 연산자와 비트 연산자를 이용한 논리 연산 

package operator_EX;

public class operator_EX3 {
	public static void main(String[] args) {
		//논리 연산자 
		// AND(&&)
		System.out.println(true && true);
		System.out.println(true && false);
		System.out.println(true && (5<3));
		System.out.println((5<=5) && (7>2));
		System.out.println();
		
		//OR(||)
		System.out.println(true || true);
		System.out.println(true || false);
		System.out.println(true || (5<3));
		System.out.println((5<=5) && (7>2));
		System.out.println();
		
		//XOR(^)
		System.out.println(true ^ true);
		System.out.println(true ^ false);
		System.out.println(true ^ (5<3));
		System.out.println((5<=5) ^ (7>2));
		System.out.println();
		
		//NOT(!)
		System.out.println(!true);
		System.out.println(!false);
		System.out.println(false || !(5<3));
		System.out.println((5<=5) || !(7>2));
		System.out.println();
		
		//비트 연산자로 논리 연산 수행
		System.out.println(true & true);
		System.out.println(true & false);
		System.out.println(true | (5<3));
		System.out.println((5<=5) | (7>2));
		System.out.println();
		
		//쇼트 서킷 사용 (논리 연산자는 사용, 비트 연산자는 사용 X)
		int value1 = 3;
		System.out.println(false && ++value1>6); //증감연산 수행 x
		System.out.println(value1);
		
		int value2 = 3;
		System.out.println(false & ++value2>6); //증감연산 수행 
		System.out.println(value2);
		
		int value3 = 3;
		System.out.println(true || ++value3>6); //증감연산 수행 x
		System.out.println(value3);
		
		int value4 = 3;
		System.out.println(true| ++value4>6); //증감연산 수행 
		System.out.println(value4);
	}
}

 
6. 대입 연산자 
 
 - 오른쪽 피연산자의 연산 결과를 왼쪽 변수에 대입하는 연산자 
 - a=a+3
  -a값에 3을 더한 후 그 결과를 다시 a에 대입
 
7.  삼항 연산자 
 
 - 유일하게 3개의 피연산자가 있는 연산자 
 - (참 또는 거짓) ? 참일 때 연산결과 : 거짓일 때 연산결과 
 - 삼항 연산자의 간단한 예

int a =(true)?1:2;
System.out.println(a); //1
int b = (a % 2 ==0)? 10 :20;
System.out.println(b); //20

- 삼항 연산자 

package operator_EX;

public class operator_EX4 {
	public static void main(String[] args) {
		//삼항 연산자 
		int value1 = (3>5) ? 6:9;
		System.out.println(value1);
		
		int value2 = (5>3) ? 10 : 20;
		System.out.println(value2);
		
		int value3 = 3;
		System.out.println((value3 % 2 == 0)? "짝수":"홀수");
		
		//if-else 구문으로 변환
		if(value3 %2 == 0) {
			System.out.println("짝수");
		}
		else {
			System.out.println("홀수");
		}
	}
}

 

'Java' 카테고리의 다른 글

4-1장 제어문 (2) 반복문  (0) 2023.04.21
4-1장 제어문 (1) 조건문  (0) 2023.04.21
3-1장 연산자의 종류  (0) 2023.04.19
2-4장 기본 자료형 간의 타입 변환  (0) 2023.04.19
2-3장 자료형의 종류  (0) 2023.04.16