Welcome! Everything is fine.

[JAVA] 자동 타입 변환, 강제 타입 변환 본문

자격증 및 기타 활동/J2KB

[JAVA] 자동 타입 변환, 강제 타입 변환

개발곰발 2022. 2. 9.
728x90

📌 타입 변환

  • 타입 변환 : 데이터 타입을 다른 데이터 타입으로 변환하는 것.
    • 자동(묵시적) 타입 변환
    • 강제(명시적) 타입 변환

📌 자동 타입 변환(Promotion)

  • 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것.
  • 큰 크기 타입 = 작은 크기 타입 → 자동 타입 변환
  • byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
byte byteValue = 10;
int intValue = byteValue; // 자동 타입 변환이 일어남.
int intValue = 200;
double doubleValue = intValue; // 200.0
char charValue = 'A';
int intValue = charValue; // 65가 저장됨.

단, 음수가 저장될 수 있는 byte 타입을 char 타입으로 자동 변환 시킬 수 없다.

byte byteValue = 65;
char charValue = byteValue; // 에러
char charData = (char)byteValue; // 강제 타입 변환

📌 강제 타입 변환(Casting)

  • 지동 타입 변환이 안돼서 강제적으로 타입 변환하는 것.
  • 작은 크기 타입 = (작은 크기 타입) 큰 크기 타입 → 강제 타입 변환
  • 강제 타입 변환이 되더라도 값은 보존 되도록 하는 것이 중요
int intValue = 103029770;
byte byteValue = (byte)intValue; // 강제 타입 변환, 기존 값 보존X
long longValue = 300;
int intValue = (int)longValue; // 기존 값 보존O
double doubleValue = 3.14;
int intValue = (int)doubleValue; // 정수 부분인 3만 저장
  • 변환으로 인한 데이터 손실 주의

아래 예시와 같이 강제 타입 변환 전에 값이 안전하게 보존될 수 있는지 검사하는 것이 좋다. 자바는 데이터 값을 검사하기 위해 boolean과 char 타입을 제외한 모든 기본 타입에 대해 최대값(max)과 최소값(min)을 상수로 제공한다.

i = 127;

if(i < Byte.MIN_VALUE || i > Byte.MAX_VALUE) {
   System.out.println("byte 타입으로 변환할 수 없습니다.");
   System.out.println("값을 다시 확인해주세요.");
} else {
   byte b = (byte) i;
   System.out.println(b);
}
기본타입 최소값 상수  최대값 상수
byte Byte.MAX_VALUE Byte.MIN_VALUE
short Short.MAX_VALUE Short.MIN_VALUE
int Integer.MAX_VALUE Integer.MIN_VALUE
long Long.MAX_VALUE Long.MIN_VALUE
float Float.MAX_VALUE Float.MIN_VALUE
double Double.MAX_VALUE Double.MIN_VALUE
  • 정수 타입을 실수 타입으로 변환할 때 정밀도 손실 피하기
int num1 = 123456780;
int num2 = 123456780;

float num3 = num2;
num2 = (int) num3;

int result = num1 - num2;
System.out.println(result); // 0이 아니라 -4가 출력됨.(정밀도 손실)
int num1 = 123456780;
int num2 = 123456780;

Double num3 = num2;
num2 = (int) num3;

int result = num1 - num2;
System.out.println(result); // 0이 출력됨.

📌 연산식에서의 자동 타입 변환

  • 연산은 같은 타입의 피 연산자간에만 수행되기 때문에 서로 다른 타입의 피연산자는 같은 타입에 크기가 더 큰 타입으로 변환된다.

아래 코드에서, int타입으로 꼭 연산을 해야한다면 double타입을 int타입으로 강제 변환 한 후 연산을 수행하면 된다.

int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; // intValue가 double값으로 변환, resul는 15.5
  • 자바는 정수 연산일 경우 int타입을 기본으로 한다.
char ai = 'A';
int result = ai + 1; // 'A'의 유니코드보다 1이 큰 유니코드가 저장
char na = (char) result; // 'B'가 저장