형변환 연산자
형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
사용 방법 : (타입) 피연산자
double d = 85.4;
int score = (int)d;
int score = (int)85.4;
int score = 85; // 정수형으로 형변환해서 소수점은 사라진다.
// 주의! d의 값은 85.4로 변하지 않는다! score의 값이 저장된 것
변환 | 수식 | 결과 |
int --> char | (char)65 | 'A' |
char --> int | (int) 'A' | 65 |
float --> int | (int)1.6f | 1 (반올림이 되지 않는다.) |
int --> float | (float)10 | 10.0f |
* 숫자 65를 char로 형변환 하면 'A'가 나오는 이유는 유니코드 문자로 변환 가능하기 때문이다.
컴퓨터는 문자를 모르고 숫자밖에 모른다. 그래서 문자를 숫자로 바꿔서 저장해야한다. 이 때 아무 숫자로 저장할 수 없고 그 기준이 있는데 그것이 유니코드 문자표이다.
자동 형변환
float f = 1234; // int 타입의 값을 float타입의 변수에 저장
// 기본적으로 타입이 다른 값에 대입은 허용하지 않는다.
// 하지만 위의 코드는 가능하다.
// 이유는 int는 2*10^9(약 20억)인데 대입하는 float는 10^38로 작은 값을 큰 타입의 변수에 넣어서 문제가 없다.
float f = (float)1234; // 그래도 원래는 형변환이 되야 하지만, 컴파일러가 자동 형변환을 한 것이다.
// 반대로 값을 넣으면?
int i = 3.14f; // 작은 값에 큰 값을 넣으려 하기 때문에 값 손실이 발생한다. 컴파일러가 자동 형변환을 해주지 못한다.
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; // 자동 형변환 불가, 직접 형변환 해야한다.
* long -> float : long은 8byte 저장 가능하고 float는 4byte 저장이 가능해서 언뜻 보기에 자동 형변환이 되지 않을 것 처럼 보이지만 표현 범위가 long은 10^19 이고, float는 10^38까지 가능하기 때문에 자동 형변환이 가능하다.
// byte타입의 범위(-128 ~ 127)값 대입
byte b = 100; // OK? 아까 분명 큰 값을 작은 값에 넣으면 에러가 난다고 했는데 왜 에러가 나지 않나?
// 이유는 byte 타입으로 자동 형변환 하여 대입 했기 때문이다.
// 분명 작은 타입에서 큰 타입을 넣을 때만 자동 형변환이 된다고 했는데 지금은 큰 타입에서
// 작은 타입으로 대입인데 이게 가능한가?
// 지금의 경우는 예외적으로 가능하다.
// byte타입의 표현 범위는 -128 ~ 127까지인데 100이라는 숫자로 표현되어 있고 컴퓨터는 숫자를 읽을 수 있기 때문에
// 컴파일러가 값 손실이 나지 않는다는 사실을 알고 있기 때문에 에러가 나지 않는 예외인 경우이다.
byte b = (byte)100; // 형변환 생략
// 그럼 아래와 같은 경우는 왜 에러인가?
int i = 100;
byte b = i; // error? 위의 경우는 리터럴 타입으로 100을 명확하게 알지만 여기서는 변수로 사용되어 컴파일러가 명확하게 값을 확신할 수 없어서 에러가 난다.
byte b = (byte)i; // ok, 그래서 수동 형변환을 해야한다.
byte b = 1000; // error? byte타입의 값 표현 범위를 벗어났기 때문에 에러
// 리터럴 타입이라고 할지라도 범위를 벗어나면 컴파일러는 자동 형변환을 해주지 않는다.
byte b = (byte)1000; // ok, 그러나 값 손실이 발생해서 변수 b에는 -24가 저장된다.
[ 자바의 정석 - 기초 유튜브 강의 영상 참고 ]
https://www.youtube.com/watch?v=mzC1CGNykL8&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=26
'Programming Language > JAVA' 카테고리의 다른 글
반올림 Math.round(), 나머지 연산자 (0) | 2023.01.16 |
---|---|
사칙 연산자, 산술 변환 (0) | 2023.01.14 |
증감 연산자, 부호 연산자 (0) | 2023.01.12 |
연산자의 우선순위 (0) | 2023.01.11 |
연산자와 피연산자 (0) | 2023.01.11 |