본문 바로가기
Java/Java Basic

타입 변환

by 키모형 2023. 2. 22.

1. 자동 타입 변환

자동으로 타입 변환이 일어나는 것으로, 값의 허용 범위가 작은 타입이 범위가 큰 타입으로 대입 될때 자동으로 발생한다.

기본 타입을 허용 범위 순으로 나열 하면 아래와 같다.

byte < short, char < int < long < float < double

byte byteValue = 10;
int intValue = byteValue;  //byte 에서 int 타입으로 자동 타입 변환이 발생

정수 타입이 실수 타입으로 대입될 경우 무조건 자동 타입 변환이 된다. 실수 타입은 정수 타입보다 허용 범위가 크기 때문

long longValue = 5000000000L;
float floatValue = longValue;		// 5.0E9f 로 저장
double doubleValue = longValue;		// 5.0E9 로 저장

연산 시 자동 타입 변환 정리

- 정수와 실수 연산 = 실수 타입 (double)
- 정수와 정수 연산 = 정수 타입 (int)
- 실수와 실수 연산 = 실수 타입 (double)
- 큰 타입과 작은 타입 연산 = 큰 타입

 

 

2. 강제 타입 변환

 

큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없다.

큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장 하는 것을 강제 타입 변환이라 한다.

 

작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입

 

int -> byte

byte 의 허용범위(-128 ~ 127) 이내의 값에 대한 강제 변환에서는 강제 타입변환된 값이 문제없이

저장이 되지만 허용범위를 넘어서는 값을 강제 변환하게 되면 예상치 못한 값이 저장된다.

int intValue = 10;
byte byteValue = (byte) intValue; // 강제 타입변환
System.out.println(intValue + " => " +  byteValue);

intValue = 99999; // byte 허용범위를 벗어난 값인경우
byteValue = (byte) intValue;
System.out.println(intValue + " => " +  byteValue);

실행결과 int 타입 값 99999를 byte 타입으로 강제 변환 한 결과 -97로 원하지 않는 값으로 저장된다.

10 => 10
99999 => -97

long -> int

long longValue = 300;
int intValue = (int) longValue; // 강제 타입변환 후에 300이 그대로 유지

 

실수 -> 정수

실수타입 (float, double)은 정수 타입(byte, short, int, long)보다 항상 큰 허용 범위를 가진다.

따라서 대상 정수 타입으로 캐스팅해서 강제 변환해야 하며, 이때 소수점 이하 부분은 버려지고 정수 부분만 저장된다.

double doubleValue = 3.14;
int intValue = (int) doubleValue; // intValue는 정수 부분 3만 저장된다.

 

3. 연산식에서 자동 타입 변환

정수 타입 변수가 산술 연산식에서 피연산자로 사용되면  int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.

// byte 타입 변수가 피연산자로 사용된 경우
byte x = 10;
byte y = 20;

//byte result = x + y;  
// 피연산자에 byte타입이 사용되어 연살결과 값이 byte 타입으로 저장이 안되고 int 타입으로 저장해야 한다.
// byte result = (int) x + (int) y; 와 같은 형 변환이 일어남 (Error!)

int result = x + y; // int 타입 변수에 저장해야 됨

System.out.printf("%d + %d = %d", x, y, result);

연산자와 피연산자중 큰 범위의 타입으로 자동 형 변환이 발생한다.

long x = 100;
int y = 5;

//int result = x + y; // long 타입이 연산식에 포함되어 있어 long보다 작은 int 형으로 저장 할 수 없다

long result = x + y; // long result = x + (long) y; 로 자동 형 변환이 발생한다.

System.out.printf("%d + %d = %d", x, y, result);  // 100 + 5 = 105

만약 int타입으로 연산을 수행 해야 한다면 double 타입을 int타입으로 강제 형 변환을 하고 연산을 수행하면 된다.

int x = 10;
double y = 5.5;

// double 타입 y값을 int 타입으로 강제 변환 후 정수값 만으로 연산수행
int result = x + (int) y;

System.out.printf("%d + %s = %d", x, y, result);  // 10 + 5.5 = 15

 

반응형

'Java > Java Basic' 카테고리의 다른 글

콘솔로 변수값 출력 - print(), println(), printf()  (0) 2023.02.24
문자열 타입 (String)  (0) 2023.02.22
변수 및 기본 타입  (0) 2023.02.22
Java 입문  (0) 2023.02.21