int x = 10, y = 20, z;
z = x + y; // +: 연산자(동사), x:피연산자, y:피연산자, x+y:연산식(expression)
// 항이 2개있는 연산자 = 이항 연산자, 항=피연산자
// =:연산자, z:피연산자, x+y : 피연산자(연산식이 피연산자가됨)
//연산자들간에 우선순위가 있기 때문에 =이 앞에 있지만 가장 늦게 연산된다
System.out.println(z); //30
사칙연산자는 + - * / 와 나머지를 구하는 %(modulus) 연산자로 구성된다
정수의 나눗셈은 몫만 출력되고 실수는 나눗셈 값이 출력됨
%연산자로 정수 뿐만 아니라 '실수'의 나머지도 구할 수 있다
정수와 실수의 사칙연산에서는 정수가 실수로 변환되어서 연산하게 된다
System.out.println("정수형 사칙 연산");
System.out.println(20 -5); // 15
System.out.println(5-20); // -15
System.out.println(10 * 662); //6620
System.out.println(150 / 8); //18, 정수의 나눗셈은 몫만 나옴, 사라지는 수는 &로 구함
System.out.println(150 % 8); //6 // modulus,(모듈러스연산) 나머지 구하는 연산자
System.out.println("실수형 사칙 연산");//
System.out.println(10.0 + 52.3); // 62.3
System.out.println(10.5f + 12.3);//22.8 //float이 double로 자동으로 변환되서 계산됨
System.out.println(10.4 - 50);//-39.6 // 정수와 실수의 계산에서는 실수형으로 변환후 연산
System.out.println(10.2 * 4.2);//42.839999
System.out.println(150 / 8.0); //18.75, 정수/실수이기에 실수로 변환 되서 몫이 아닌 실수값이 나옴
System.out.println(5.2 / 1.2); //4.333333333333334// 몫이 아닌 나머지 까지 나눈 실수값
System.out.println(5.2 % 1.2);// 0.40000000000000036 // 실수도 modulus 연산으로 나머지 계산 가능
//0.4가 나와야되는데 소숫점 조금 더 나오는데 그건 부동소수점 오차
System.out.println("");
사칙 연산의 결과가 overflow되서 전혀 다른 값이 출력 될 수 있다
실수의 사칙연산의 결과는 미세한 오차가 발생 할 수 있다
계산식은 오류가 안나지만 값에 따라 Infinity, NAN이 뜨기도 한다
System.out.println("사칙연산 주의사항");
//overflow가 있음
System.out.println(Integer.MAX_VALUE /2 *3); //-1073741827,값이 overflow되버림
System.out.println(Integer.MAX_VALUE); //2147483647 //최대값
System.out.println(Integer.MAX_VALUE+1); //-2147483648 // 최대값+1 = 최소값
System.out.println(Integer.MIN_VALUE); //-2147483648 // 최소값
System.out.println(Integer.MIN_VALUE-1); //2147483647 // 최소값 -1 = 최대값
//참고 : 최대값 +1이 최소값이 되는 이유
int maxVal = 0b01111111111111111111111111111111; // 최대값에서 +1을 하면 맨끝짜리부터 값이 올라가서 00000하다가 맨끝에서1이됨
int maxVal1= 0b10000000000000000000000000000000; // = Integer.MIN_VALUE
// Integer.MAX_VALUE에 2의 보수를 구하면 0b10000000000000000000000000000001
// 근데 Integer에 표현범위는 양수가 하나 작음, 그래서 min Val이 하나 더 많아야되는데 음수니까 +1이 아니라 -1을 해줘야됨
// 그래서 -1을 하면 int minVal = 0b10000000000000000000000000000000;이 나오게 된다
//실수의 오차발생
System.out.println((6 - 5.9) *10); //0.99999999999999964// 1이어야 하는데 정밀도 부족
System.out.println(Math.floor((6-5.9)*10)); //0.0 // floor는 내림연산 1미만이기에 0
// 큰 문제 발생가능// 특히 실수 6.0이 정밀도 떨어져서 더 오차 발생
System.out.println(40/0.0); // infinity // 0으로 나누면 -0을 무한대로 하는 개념, so그 전에 막아버림
System.out.println(40%0.0); // NaN// Not a Number 숫자가 아니다. 인피티티가 뜬다 난이뜬다 라고 얘기함
// 수식에는 문제가 없지만 값에 문제가 있는 경우이기에 살펴봐야함
System.out.println("");
//실수형 오차는 딥러닝 같이 여러번 연산을 반복하는 경우 큰 문제가 발생하지만, 그외에 경우에는 미미해서 크게 영향은없음
// 하지만 실수의 연산 값을 정수형으로 활용하려고 할때는 데이터 소실의 문제가 발생할 수 있다.
// 대입 연산자
z = x + y;
z += 10; // z = z+10;의 줄인 형태, +자리에 4칙연산자 + %까지 가능함, 비트연산자도 가능
z %= 2;
System.out.println("비교 연산자");// 출력이 boolean
System.out.println(10>20); // false
System.out.println(10<20); // true
System.out.println(10>=10); // true // 노란색 불빛은 자명해서 나옴.
x= 10;
y= 10;
System.out.println(x == y); //true// 같다는 "=="
System.out.println(x != y); //false// 다르다는 "!="
System.out.println(10 <20 & 40 >= 2);// true // 양쪽이 모두 ture이기에 true
System.out.println(40 < 2 | 1> 0); //true // 1>0이 참이기에 참
System.out.println(!(10>20)); //true //false의 not은 true// 단항연산자!!
System.out.println(10>2 ^ 5 >2); //false //^ = XOR
System.out.println("");
//short - circuit // 앞에만 비교해서 조건맞으면 뒤에는 검사 안한다
System.out.println(10<20 && 4<2); // 비트단위로 비교하는 short -circuit. 연산이 더 빠르다정도만 알자
System.out.println(10<20 || 2<5);
증감 연산자는 단항 연산자로 값을 증가시키거나 감소시킨다
증감 연산자가 값의 앞에 붙으면 증감 먼저 반영하고 Expression 평가함
반대로 증감 연산자가 값의 뒤에 붙으면 Expression 평가하고 증갑을 반영함
int val = 0;
System.out.println(val++); //0 // value값을 그대로 사용한 후에 다음에 value에 +1을 해줌
// val = 0으로 먼저 Expression 평가 후에 val +=1 적용
// sout(val);
// val +=1;
System.out.println(++val); //2 // val +=을 먼저 계산 후에 Expression 평가
// val +=1;
//sout(val)
System.out.println(val--); //2
// sout(val);
// val -=1;
System.out.println(--val); //1
// val -=1;
//sout(val)
val = 5;
int new_val = val++ * 10 + --val;
// 5*10
// val++ 로 val 이 6이됨
// --val 로 val 이 5가됨
// 5*10 +5=5
System.out.println(new_val); //55
System.out.println(true?1:0);//1
System.out.println(false?1:0);//0
x = 10;
y = 13;
System.out.println(x > y ? x : y); // max function, 더 큰게 출력 되는 구조
System.out.println(x < y ? x : y); // min funciton, if문을 간단하게 쓰는 연산자로 자주쓰임
System.out.printf("b%32s\n", Integer.toBinaryString(1252)); //b 10011100100
System.out.printf("b%32s\n", Integer.toBinaryString(15234));//b 11101110000010
System.out.printf("b%32s\n", Integer.toBinaryString(1252 & 15234));//b 10000000
//AND, 하나라도 0이면 0, 둘다 1이면 1
System.out.printf("b%32s\n", Integer.toBinaryString(1252 | 15234));//b 11111111100110
//OR, 하나라도 1이면 1 둘다0이면 0
System.out.printf("b%32s\n", Integer.toBinaryString(1252 ^ 15234));//b 11111101100110
//XOR, 둘중 하나만 1일때 1, 나머지 0
System.out.printf("b%32s\n", Integer.toBinaryString(~1252)); //b11111111111111111111101100011011
//not은 !아닌 ~, 단항연산자, 1=>0, 0=>1 도출
System.out.printf("b%32s\n", Integer.toBinaryString(8)); //1000
//Integer.toBinaryString(int)
System.out.printf("b%32s\n", Integer.toBinaryString(8>>1));//100 // >>은shift 연산자
//>>1 은 오른쪽으로 한칸씩 옮긴것임 1000 => 100, 2진수에서 한칸씩 내려간다는 것은 절반으로 줄어든다는 뜻
System.out.printf("b%32s\n", Integer.toBinaryString(7));//111
System.out.printf("b%32s\n", Integer.toBinaryString(7>>1)); //11 3,5가 아닌 소숫점 자른 3이 나온다
System.out.printf("b%32s\n", Integer.toBinaryString(1423));//10110001111
System.out.printf("b%32s\n", Integer.toBinaryString(1423<<2)); //1011000111100
System.out.printf("b%32s\n", Integer.toBinaryString(1423>>4)); //1011000
System.out.printf("b%32s\n", Integer.toBinaryString(1423<<2)); //1011000111100
System.out.printf("b%32s\n", Integer.toBinaryString(1423<<4)); //101100011110000
//새로 추가 되는 비트는0으로 추가됨
System.out.printf("b%32s\n", Integer.toBinaryString(-1)); //b11111111111111111111111111111111
System.out.printf("b%32s\n", Integer.toBinaryString(-1>>1)); //b11111111111111111111111111111111
// 사인비트의 영향으로 1으로채워짐//변화없음
System.out.printf("b%32s\n", Integer.toBinaryString(-1>>>1)); // b 1111111111111111111111111111111
// 사인비트보다 한칸 더채워서 0으로채워짐
// <<에는 <<<없지만 >>에는 >>>이 있다.
int intVal = 4123;
intVal >>= 2; // intVal = intVAll>>2; Shift 연산자도 대입연산자 가능
intVal |= 412; // intVal = intVal | 412; Bitwise 연산자도 대입연산자 가능