1. 형변환(casting)
변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것
2. 형변환 방법
1) char(문자형) ↔︎ int(정수형)변환: char(문자형) '0'을 더하기/빼기
a. char(문자형) → int(정수형): '3'-'0'
b. int(정수형) → char(문자형): 3+'0'
2) char(문자형)/int(정수형) → String(문자열) 변환: 빈 문자열 더하기
a. int(정수형) → String(문자열): 3+""="3"
b. char(문자형) → String(문자열): '3'+""="3"
3) String(문자열) → char(문자형)/int(정수형)/double(실수형) 변환
a. String(문자열) → int(정수형): Integer.parseInt("3")
b. String(문자열) → double(실수형): Double.parseDouble("3.4")
c. String(문자열) → char(문자형): "3".charAt(0)
class Ex2_12 {
public static void main(String args[]) {
String str = "3";
System.out.println(str.charAt(0) - '0'); // '3'-'0'= 3
System.out.println('3' - '0' + 1); // 3 + 1 = 4
System.out.println(Integer.parseInt("3") + 1); // 3 + 1 = 4
System.out.println("3" + 1); // "31"
System.out.println(3 + '0'); // '3'
}
}
3. 형변환 연산자(=캐스트 연산자)
- 변수나 리터럴 앞에 변환하고자 하는 타입을 괄호'()'안에 넣어주면 됨
변환 | 수식 | 결과 |
char(문자형) → int(정수형) | (char)65 | 'A' |
int(정수형) → char(문자형) | (int)'A' | 65 |
float(실수형) → int(정수형) | (int)1.6f | 1 |
int(정수형) → float(실수형) | (float)10 | 10.0f |
👉🏻 피연산자의 값을 읽어 지정된 타입으로 형변환 후 결과를 반환(피연산자인 변수의 값은 변하지 않음)
4. 자동 형변환
1) 서로 다른 타입 간 대입이나 연산 시 형변환을 하여 타입을 일치시켜야 함(원칙)
2) 경우에 따라 형변환 생략 가능
- 컴파일러가 자동 형변환 처리함
- 변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하는 경우에 형변환 생략 시 에러 발생
byte b = 1000; // ERROR, byte 타입의 범위(-128 ~ 17)를 벗어난 값을 대입해서 에러 발생
3) 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환 됨
- 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 자동 형변환됨
👉🏻 byte(1byte) -> short(2byte) -> int(4byte) -> long(8byte) -> float(4byte) -> double(8byte)
- 값 손실이 있을 경우 에러 발생
float f = (float)1234; // 원칙
float f = 1234; // int형의 값을 float타입의 변수에 저장, 컴파일러가 자동형변환 처리
int i = 3.14f; // ERROR, 변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하는 경우
int i = (int)3.14f // OK, 수동으로 형변환 처리하는 경우 3이 변수 i에 저장됨
byte b = (byte)100; // 원칙
byte b = 100; // OK, 변수가 저장할 수 있는 값의 범위(-128~ 127)보다 작은 값을 저장 하는 경우 자동형변환
int i = 100;
byte b = i; // ERROR, int형은 4byte로 변수b가 저장할 수 있는 범위(1byte)보다 더 크기때문에 에러 발생
byte b = (byte)i; // 원칙, byte타입으로 형변환하여 대입
byte b = 1000; // ERROR, byte타입의 범위(-128 ~ 127)를 벗어난 값이기 때문에 에러 발생
byte b = (byte)1000; // OK, 값 손실이 발생하지만 명시적으로 형변환한 경우로 컴파일러는 의도적인 것으로 간주하여 에러를 발생시키지 않음
/* cf) b=-24 저장됨, 10진수 1000 -> 2진수 1111101000
1byte(=8bit)부호 1bit, 값 7bit
부호: 1(음수), 값 1101000
부호bit가 1로 음수이기 때문에, 1101000을 2의 보수로 만들면 0011000
10진수로 변환하면 -24가 됨
*/
'Java' 카테고리의 다른 글
Java 연산자(Operator) - 산술 변환 (0) | 2022.09.28 |
---|---|
Java 연산자(Operator)의 종류와 우선 순위 (0) | 2022.09.28 |
Java Scanner클래스 (0) | 2022.09.28 |
Java print(), println(), printf() (1) | 2022.09.28 |
Java 변수(Variable) - 변수의 데이터 타입(Data type) (0) | 2022.09.28 |