Java 언어를 많이 접해보고
Java로 코딩테스트를 어느정도 준비해보았는데도
'형변환'은 어렵다.
기본적인 내용이라 생각했고
당연히 알고있다고 자만했었는데,
절대 제대로 이해하고 있지 않았다는 것을
이번 수업을 들으며 깨닫고 있다.
일단 첫번째로 중요한 건
'언제 (묵시적) 형변환이 가능하냐'일 것이다.
표현 범위가 넓은 타입의 값으로 표현 범위가 낮은 타입을 가리킬 때는
묵시적으로 형변환이 일어난다.
따름 정리)
표현 범위가 낮은 타입이 표현 범위가 넓은 타입의 값을 가리킬 때는 명시적 형변환이 필요하다.
!여기서 중요한 것!
표현 범위가 넓다
의 의미가 무엇인가?
float과 long은 각각 4바이트, 8바이트이다.
이 중 표현범위에서 큰 타입은 무엇인가?
byte -> char, char -> byte
short -> char, char -> short
명시적으로 형변환을 해주어야 한다. ( 안해주면 Type Mismatch
에러가 난다. )
이항 연산자와 단항 연산자는 연산하는 방식이 다르다.
이 부분을 내가 정말 모르고 있었다.
이항 연산자 (+)는 내부적으로 JVM의 피연산자 스택을 사용하여 내부적으로 int로 변환해서 결과 값의 타입은 int이다.
단항 연산자는 해당 변수에 1값을 증가시킨다. 해당 변수의 타입까지 변환하지는 않는다.
++A -- 65로 인식하고, 65+1을 한다. => 66을 char로 변환해서 리턴한다. ( int로 형변환이 일어나지 않았다 )
// Quiz 1. 변수와 형변환. 리터럴
int x = 2;
int y = 5;
char c = 'A';
System.out.println(y += 10 - x++);
System.out.println(x += 2);
System.out.println('C' - c);
System.out.println('5' - '0');
System.out.println(c+1); // 이항연산자 -> JVM 피연산자 스택에서 int로 변환하여 계산
System.out.println(++c); // 단항연산자 -> Operand 자체의 타입을 변환
System.out.println(c++); // 단항 연산자 -> Operand 자체의 타입을 기반으로 변환
// c = c + 1이랑 c++; 이랑 다르다.
System.out.println(c); // 그냥 char 타입 출력.
// 형변환 쪽에서 정말 중요한 문제
byte b = 10;
char ch = 'A';
int i = 100;
long l = 1000L;
b = (byte) i;
ch = (char) b;
short s = (short) ch;
float f = (float) l;
i = (int) ch;
int score = 70;
char grade = '\u0000';
if(score >= 90){
grade = 'A';
} else if(score >= 80){
grade = 'B';
} else if(score >= 70){
grade = 'C';
} else {
grade = 'F';
}
System.out.println(grade);