자바의 정석 - 기초편

형변환 연산자

ODaram 2022. 8. 1. 17:30

항변환이란,

 변수 또는 상수의 타입을 다른 타입으로 변환 하는 것

   (타입) 피연산자 

   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

*우리가 입력하는 것들은 문자표에 해당하는 코드로 바뀌어 저장됨

유니코드 문자표 (6만개 -> 100만자 확장됨)

자동 형변환

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; // 생략불가 (=수동 형변환) (값손실 있음)

1. byte > int , 2. int > byte

형변환 하는 이유는 주로 서로 다른 두 타입을 일치시키기 위해서인데,

형변환을 생략하면 컴파일러가 알아서 자동으로 형변환을 한다. (작은 값을 큰 값으로 넣을때만)

"기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."

그래셔 표현범위가 좁은 타입에서 넓은 타입으로 형변환 하는 경우에는 값 손실이 없으므로 두 타입 중에서

표현범위가 더 넓은 쪽으로 형변환된다.

타입별 크기

(예외)

값의 타입이  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가 저장됨