[KOSTA 교육 12일차] C++과 C = C+1은 같은 연산이 아니다. | 형변환과 리터럴 | 이항연산자와 JVM의 피연산자 스택

junjun·2024년 4월 25일
0

KOSTA

목록 보기
11/48

Java 언어를 많이 접해보고
Java로 코딩테스트를 어느정도 준비해보았는데도
'형변환'은 어렵다.

기본적인 내용이라 생각했고
당연히 알고있다고 자만했었는데,
절대 제대로 이해하고 있지 않았다는 것을
이번 수업을 들으며 깨닫고 있다.

일단 첫번째로 중요한 건
'언제 (묵시적) 형변환이 가능하냐'일 것이다.

형변환 ( Type Casting )

표현 범위가 넓은 타입의 값으로 표현 범위가 낮은 타입을 가리킬 때는
묵시적으로 형변환이 일어난다.

  • 따름 정리)
    표현 범위가 낮은 타입이 표현 범위가 넓은 타입의 값을 가리킬 때는 명시적 형변환이 필요하다.

  • !여기서 중요한 것!

  • 표현 범위가 넓다 의 의미가 무엇인가?

float과 long은 각각 4바이트, 8바이트이다.
이 중 표현범위에서 큰 타입은 무엇인가?

    1. byte, short 와 char간의 형변환 시
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);

0개의 댓글