작은 데이터 타입에서 큰 데이터 타입으로의 변환은 자동으로 수행됩니다. 이는 데이터 손실 위험이 없기 때문에 자바가 암묵적으로 허용합니다.
int a = 100;
long b = a; // int → long (자동 형변환)
float f = 3.14f;
double d = f; // float → double (자동 형변환)
byte → short → int → long → float → double
↑
char
char는 정수형인 int로 자동 형변환됩니다.
char ch = 'A';
int code = ch; // 65로 변환됨
큰 데이터 타입을 작은 데이터 타입으로 변환할 때는 데이터 손실 가능성이 있기 때문에 명시적으로 형변환을 지정해야 합니다.
타입 변수 = (타입) 값;
double d = 3.14;
int i = (int) d; // 3 (소수점 버려짐)
long l = 1000L;
short s = (short) l;
int x = 128;
byte b = (byte) x; // 결과: -128 (오버플로우 발생)
자바에서 두 개의 서로 다른 타입을 연산할 경우, 자동으로 더 큰 타입으로 변환된 후 연산이 수행됩니다.
int a = 10;
double b = 5.5;
double result = a + b; // a가 자동으로 double로 변환
또한, 정수형끼리 연산 시 결과도 정수형이므로 주의가 필요합니다.
int x = 5;
int y = 2;
double avg = x / y; // 결과: 2.0이 아닌 2.0 (정수 나눗셈)
해결하려면 하나를 double로 형변환해야 합니다:
double avg = (double) x / y; // 결과: 2.5
하위 클래스 → 상위 클래스 변환은 자동으로 수행됩니다.
Dog dog = new Dog();
Animal a = dog; // 업캐스팅 (자동)
상위 클래스 → 하위 클래스 변환은 명시적 형변환 필요하며, 실제 객체 타입이 일치해야 함.
Animal a = new Dog();
Dog d = (Dog) a; // 다운캐스팅 (명시적)
실제 타입이 다르면 ClassCastException이 발생합니다.
Animal a = new Cat();
Dog d = (Dog) a; // 런타임 오류 발생
안전한 다운캐스팅은 instanceof 연산자를 활용합니다:
if (a instanceof Dog) {
Dog d = (Dog) a;
}
int n = 100;
String s = String.valueOf(n);
또는
String s = n + "";
int i = Integer.parseInt("123");
double d = Double.parseDouble("3.14");
변환 실패 시 NumberFormatException이 발생할 수 있으므로 예외 처리를 함께 사용하는 것이 좋습니다.
클래스 |
기능 |
---|---|
Integer, Double 등 |
문자열 ↔ 기본형 형변환 지원 |
String.valueOf() |
어떤 타입이든 문자열로 변환 |
parseInt, parseDouble |
문자열을 숫자로 변환 |
구분 |
설명 |
---|---|
자동 형변환 |
작은 타입 → 큰 타입, 손실 없음 |
강제 형변환 |
큰 타입 → 작은 타입, 손실 가능성 존재 |
참조형 변환 |
업캐스팅은 자동, 다운캐스팅은 명시 필요 |
연산 시 변환 |
더 큰 타입으로 자동 형변환 후 연산 |
문자열 변환 |
valueOf, parseXxx 등 메서드 활용 |