// 강제 타입 변환
double b = 10.5;
System.out.println(b); // 10.5
System.out.println((float)(b + 1)); // 11.5
System.out.println((long)b); // 10
System.out.println(b); // 10.5 출력문에서 타입 변환은 리터럴이 변하지 않음
System.out.println((int)(b += 1)); // 11
System.out.println(b); // 11.5 대입 연산자는 리터럴이 변함
System.out.println(b++); // 11.5
System.out.println(b); // 12.5 증감 연산자도 리터럴이 변함
System.out.println("=====");
// 자동 타입 변환
int i = 100;
long l = i;
System.out.println(l); // 100
float f = l;
System.out.println(f += 0.1); // 100.1
double d = f;
System.out.println(d); // 100.0999984741211 100.1보다 작음?
/*
boolean b = d < 100.1;
System.out.println(bb); // true 100.1 보다 작다
b = d > 100;
System.out.println(bb); // true 100 보다 크다
// 오류 아님
*/
System.out.println("=====");
d = 100.5;
double result = (int)(d += 10); // result는 double타입(소수점), d는 정수타입(소수점 버림)
System.out.println(result); // 110.0 소수점이 버려지고 소수점 출력
System.out.println((int)d); // 110
System.out.println(d); // 110.5 식에서의 타입 변환도 리터럴이 변하지 않음
System.out.println("=====");
double dd = 100.5;
int a = (int)dd;
System.out.println(a); // 100
double ff = a;
System.out.println(ff); // 100.0 실수형double -> 정수형int -> 실수형double 은 소수점 값이 버림되어 돌아오지않음
System.out.println(dd); // 100.5 실수형double dd의 리터럴은 변하지 않음
+추가)
부동소숫점 오류
실수 변수는 절대 정확한 값을 가지고 있지 않음
float보다는 double형 변수를 쓰는게 좋음
정수가 들어있는 실수형 변수를 정수로 바로 캐스팅하면 안됨
비교 연산을 할 때는 등호를 사용하면 안됨
https://www.acmicpc.net/blog/view/37
String a = (65 + 1 + "왓" + (char)65 + 1);
System.out.println(a); // 66왓A1
String b = (65 + 1 + "이프" + 1 + (char)65);
System.out.println(b); // 66이프1A
String c = (65 + 1 + "왓이프" + (char)(1 + 65));
System.out.println(c); // 66왓이프B
String d = ((char)65 + 1 + "왓이프" + (char)(1 + 65));
System.out.println(d); // 66왓이프B
// int > char , 자동 타입 변환
String e = ((char)(65 + 1) + "왓이프" + (char)(1 + 65));
System.out.println(e); // B왓이프B
int a = 65;
byte b = (byte)a;
System.out.println(b); //
char c = (char)a;
System.out.println(c); //
short s = (short)a;
System.out.println(s); // 캐스팅 연산자로 타입 변환 후 대입 가능
int i = a;
System.out.println(i); //
long l = a;
System.out.println(l); //
float f = a;
System.out.println(f); //
double d = a;
System.out.println(d); // 자동 타입 변환으로 대입 됨
+추가)
자바는 정수형 기본은 int로 처리
char c1 = '자';
char c2 = '바';
System.out.println(c1+c2); // 99236
System.out.println((char)c1+(char)c2); // 99236
System.out.println((char)c1+c2); // 99236 정수형으로 연산됨
System.out.println((char)(c1+c2)); // ? 99236 아스키코드 없음
String s1 = c1+c2+"c1+c2"+c1+c2; // "" 앞은 연산, 뒤는 문자열
String s2 = ""+c1+c2;
System.out.println(s1); // 99236c1+c2자바
System.out.println(s2); // 자바
char ch1 = 'j';
char ch2 = 'a';
char ch3 = 'v';
String st = "" + ch1 + ch2 + ch3 + ch2;
System.out.println(st); // java
String s1 = "A";
char c = 'A';
System.out.println(s1); // A
System.out.println(c); // A
// boolean b = (s == c); // 에러
// 비교연산자 ‘==’ 에 사용된 피연산자. 즉, 비교 대상 값이 이상하다는 에러
int i = 65;
boolean b1 = (c == i);
System.out.println(b1); // true
String s2 = "A";
boolean b2 = (s1 == s2);
System.out.println(b2); // true
+추가)
// float과 double을 비교해보면 true가 나올까?
float f = 1.0F;
double d = 1.0;
System.out.println(f); //1.0
System.out.println(d); //1.0
boolean bb = (f == d);
System.out.println(bb); //true
// 정수형과 실수형을 비교하면?
int ii = 1;
bb = (f == ii);
System.out.println(bb); //true
bb = (d == ii);
System.out.println(bb); //true
// 정수 1과 실수 1.0은 같다는 판정
// 부동 소수점 오차로 double 값 변한다면? float과 비교
f = 1.3F;
d = f;
System.out.println(f); // 1.3
System.out.println(d); // 1.2999~
bb = (d == f);
System.out.println(bb); // true
//소수점 오차가 나도 true 나옴
bb = (d < f);
System.out.println(bb); // false
// System.out.println(d += 0.0000000000000001);
// System.out.println(f == d); // true
// 소수점 16번째 자리에 1을 더하면 true가 나옴 / 나머지는 false
실수형은 되도록 double을 쓰고, 소수점 오차를 파고들지 말기
int a = 10;
int result = (a > 0) ? (++a > 5) ? (a++ > 9) ? 1000 : 100 : 10 : 0;
System.out.println(result); // 1000
System.out.println(a); // 12
System.out.println("=====");
int b = 20;
result = (b < 0) ? (++b > 5) ? (b++ > 9) ? 1000 : 100 : 10 : 0;
System.out.println(result); // 0
System.out.println(b); // 20
System.out.println("=====");
int c = 30;
result = (c > 0) ? (c-=10 <= 5) ? (c*=2 > 9) ? 1000 : 100 : 10 : 0;
System.out.println(result); // 피연산자가 잘못되었다는 에러
System.out.println(c); // first type : int , second type : boolean
인트타입 변수 + 복합대입 연산자 + 비교 연산자 사용 불가?
+해결)
복합대입 연산자와 비교 연산자가 혼합되어 있어서 우선순위를 명확히 할 수 없음
괄호를 추가하여 연산자 우선순위를 명확히 해주어야 함
int c = 30;
result = (c > 0) ? ((c-=10) < 5) ? ((c*=2) > 9) ? 1000 : 100 : 10 : 0;
System.out.println(result); // 10
System.out.println(c); // 20
+추가)
삼항 연산자를 중첩해서 사용하는 것이 코드의 가독성을 해치고 오류를 발생시킬 가능성을 높일 수 있음.
이를 방지하기 위해 코드를 명확하고 간결하게 작성하는 것이 좋음
int a = 10;
int b = 20;
boolean result = a < b || a++ > ++b;
System.out.println(result); // true
System.out.println(a); // 10
System.out.println(b); // 20
int bin = 0b1010;
int result = bin >> 2;
System.out.println(result); // 2
System.out.println(bin); // 10
// bin의 리터럴이 변하는 것이 아님
result = bin >>= 2;
System.out.println(result); // 2
System.out.println(bin); // 2
result = bin << 2;
System.out.println(result); // 8