자바 기본형변환 / 타입변환 - (형변환, 자동형변환, 강제형변환, 객체타입변환, 기본타입변환, 자동타입변환, 강제타입변환)
해당 페이지에는
신용권님의 저서 [이것이 자바다]를 읽고 정리한 내용이 기록되어있습니다.
형변환(타입변환-type conversion)이란
기존 데이터 타입을 새로운 데이터 타입으로 변환하는것으로,
int 타입을 long타입으로 변환(주로 자동형변환)하거나, long 타입을 int 타입으로 바꾸는 식(주로 강제형변환)의 타입변환을 의미한다.
byte, short, int, long, double 등과 같은 기본형끼리의 형 변환도 있고, 객체간의 형변환도 존재한다.
자동형변환, 강제형변환, 기본형변환, 객체형변환은 데이터 타입을 변환한다는 동일한 속성을 가지고 있다.
하지만 변환 가능한 조건이 저마다 다르기에 세분화하여 살펴보고 익히도록하자.
여기서는 기본형변환에 대해서만 알아볼 것입니다.
객체형변환 관련 공부는 아래의 링크를 참고해주세요 !
자바 형변환 / 타입변환 - (자동형변환, 강제형변환, 객체타입변환, 기본타입변환, 자동타입변환,
해당 페이지에는 신용권님의 저서 [이것이 자바다]를 읽고 정리한 내용이 기록되어있습니다. 형변환(타입변환-type conversion)이란 기존 데이터 타입을 새로운 데이터 타입으로 변환하는것으
isjiji.tistory.com
-- 기본형변환 그림으로 파악하기 --

1. 자동 형변환(promotion)
자동형변환은 자바 소스가 실행될 때 스스로 형(type)을 변환하는 것이다. 즉 개발자가 형변환하는 코드를 직접 입력하지 않아도 스스로 형변환하여 실행되며, 변환이전의 값은 변환된 이후에도 손실없이 그대로 보존된다.
1) 기본타입 자동형변환
먼저 기본타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말하며 아래의 표기를 사용해 데이터 용도와 데이터 크기에 맞는 타입을 정한다.
정수타입표기 : byte, char, short, int, long 실수타입표기 : float, double ex) int num1 = 100; long num2 = 1000000000L; double num3 = 1.123456789123456789; |
기본타입의 자동형변환은 작은 메모리크기를 가진 타입이 큰 메모리크기를 가지는 타입에 저장, 실행될 때 발생한다.
아래 소스를 보자.
byte b = 10;
int i = b; // byte 타입의 b 는 자동형변환되어 int 로 변환됨.
long l = i; // int 타입 i는 자동형변환되어 long타입으로 변환됨.
위 소스와 같이 더 작은 데이터타입이 더 큰 타입에 저장된 경우 실행할 때 자동형변환이 일어난다.
정수와 실수 간에도 자동형변환이 일어나는데, flot의 데이터크기는 4byte로 int 와 동일하지만, int와 long보다 큰 타입으로 본다. 그 이유는 flot이 int와 long보다 표현할 수 있는 값의 범위가 더 크기 때문이다.
그렇기에 정수타입이 실수 타입으로 변환될때는 무조건 항상 자동형변환된다.
왜? 실수타입이 정수타입보다 크기 때문에!
int i = 100; // 정수타입 i, 실수타입 b
double d = i; // 자동형변환 되어 d의 값은 실수 100.0 이 됨.
2. 강제형변환(casting)
강제형변환은 더 큰 타입을 더 작은 타입으로 변환할 때 사용한다.
강제형변환 할 때 사용하는 연산자는 ( ) 이며, 이 괄호 안에 변환할 타입을 입력해준다. ex) (byte)33333333;
1) 기본타입 강제형변환
그런데 큰 4byte(int)를 작은 1byte(byte)에 다 담을 수는 없다. 어떻게 큰타입을 작은타입에 담을까?
바로 쪼개기기법을 사용한다. 4byte를 1byte씩 쪼갠 다음, 끝에 있는 1byte만 변수에 담는것이다.
값이 변할경우 쓰레기값이 만들어져 무의미한 형변환이 된다.
int i =111111111; // i 값을 출력하면 할당된 111111111 이 나오지만,
byte b=(byte) i; // b 값을 출력하면 -57 이 나옴
물론, int i의 값이 byte값의 범위 안에 들어가는 수라면, 데이터만 변환되고 값은 유지된다.
이렇게 값이 유지될 수 있는 경우 유의미한 형변환이 된다.
int i = 120;
byte b =(byte)i; //b는 120을 그대로 담는다. byte가 양수 127까지 담을 수 있기 때문
실수타입을 정수타입으로 강제형변환 할 때는 소수점은 삭제되고, 정수만 남는다.
2) 주의할 점 : 최솟값과 최댓값
강제형변환을 할 때는 변환하기 이전의 값이 손실되면 안된다. 그렇기에 강제형변환 후에도 값을 유지할 수 있는 유효성 검사를 해준 다음 강제형변환을 진행하는 것이 올바르다.
각 기본 타입은 할당가능한 최솟값과 최댓값이 존재한다. 타입별 최솟값과 최댓값을 벗어나지 않도록,
최댓값과 최솟값을 구하는 상수를 사용하여 유효성검사를 할 수 있다.
| 기본타입 | 최댓값 상수 | 최솟값 상수 |
| byte | Byte.MAX_VALUE | Byte.MIN_VALUE |
| short | Short.MAX_VALUE | Short.MIN_VALUE |
| int | Int.MAX_VALUE | Int.MIN_VALUE |
| long | Long.MAX_VALUE | Long.MIN_VALUE |
| float | Float.MAX_VALUE | Float.MIN_VALUE |
| double | Double.MAX_VALUE | Double.MIN_VALUE |
ex)
int i = 120;
if( i < Byte.MIN_VALUE || i > Byte.MAX_VALUE ){
//유효성 오류문
System.out.println("형변환할 경우 값이 손실됩니다.");
} else {
//casting 문
byte b = (byte) i;
System.out.println(b); //120 출력됨
}