본문 바로가기

Java

Java 타입(type)간 변환 & 형변환(casting) 연산자

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가 됨
*/