항변환이란,
변수 또는 상수의 타입을 다른 타입으로 변환 하는 것
(타입) 피연산자
ex) double d = 85.4;
int score = (int) d; -> d는 double 이라 저장이 불가하므로 int 로 변경해줌
-> int score = (int) 85.4;
-> int score = 85;
형변환 연산자
변환 | 수식 | 결과 |
int -> char | (char) 65 | ' A ' |
char -> int | (int) 'A' | 65 |
float -> int | (int) 1.6 f | 1 (반올림 되지 않음) |
int -> float | (float) 10 | 10.0 f |
*우리가 입력하는 것들은 문자표에 해당하는 코드로 바뀌어 저장됨
자동 형변환
float f = 1234; // int 타입의 값을 float 타입의 변수에 저장 (형변환 생략됨)
(float가 훨씬 크기 때문에 작은 값을 큰 타입의 변수에 넣어서 문제X)
float f = (float) 1234; // 자동 형변환 ; 컴파일러가 자동으로 형변환을 해줌
int i = 3.14 f; // 에러 (float범위가 넓은데, 작은 쪽인 int 타입으로 넣으려고 하기때문에 실패)
3.14f -> (int) -> 3 : 값손실 발생
int i = (int) 3.14f // OK (수동 형변환)
1. byte -> int
byte b = 10;
int i = b ; // 형변환 생략 가능 (=자동 형변환) (값손실 없음)
2. int -> byte
int i2 = 300;
byte b2 = (byte)i2; // 생략불가 (=수동 형변환) (값손실 있음)
형변환 하는 이유는 주로 서로 다른 두 타입을 일치시키기 위해서인데,
형변환을 생략하면 컴파일러가 알아서 자동으로 형변환을 한다. (작은 값을 큰 값으로 넣을때만)
"기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."
그래셔 표현범위가 좁은 타입에서 넓은 타입으로 형변환 하는 경우에는 값 손실이 없으므로 두 타입 중에서
표현범위가 더 넓은 쪽으로 형변환된다.
(예외)
값의 타입이 int 인지 알지만 크기가 100 (byte타입 내에 있는 값) 인 것을 알기 때문에 자동 형변환 해줌(값손실X)
byte b = 100; // OK. byte 타입의 범위 (-128 ~ 127)의 값의 대입
byte b = (byte) 100; // OK. byte 타입으로 자동 형변환 하여 대입
int i = 100;
byte b = i; (int) // 에러. int 타입을 byte의 타입에 대입 (위 예제와는 다르게 변수로 설정되어있어 값이 뭔지 몰라 에러)
byte b = (byte) i; // OK. byte타입으로 형변환하여 대입
상수일지라도 값 손실이 발생하는 경우에는 자동 형변환을 해주지 못함 (= 수동형변환 필요)
byte b = 1000; // 에러. byte 타입의 범위(-128 ~ 127) 를 벗어난 값의 대입
byte b = (byte) 1000; // OK.. 그러나 값 손실이 발생해서 변수 b에는 -24가 저장됨
'자바의 정석 - 기초편' 카테고리의 다른 글
반올림 Math.round(), 나머지 연산자 (0) | 2022.08.01 |
---|---|
사칙 연산자, 산술 변환 (0) | 2022.08.01 |
증감 연산자, 부호 연산자 (0) | 2022.08.01 |
연산자의 우선순위와 결합규칙 (0) | 2022.07.30 |
연산자와 피연산자 (0) | 2022.07.30 |