기본형 간의 형변환은 자동 형변환(묵시적)과 강제 형변환(명시적)으로 나뉩니다.
작은 크기의 타입에서 큰 크기의 타입으로 변환할 때 자바가 자동으로 수행합니다.
| byte → short → int → long → float → double |
| char → int → long → float → double |
예시:
int i = 100;
long l = i; // int → long (자동 형변환)
float f = l; // long → float (자동 형변환)
큰 타입을 작은 타입으로 변환할 때는 데이터 손실 가능성이 있기 때문에 명시적으로 형변환을 지정해야 합니다.
double d = 9.78;
int i = (int) d; // double → int (소수점 이하 제거됨)
byte b = 10;
int i = b; // 자동 형변환
int x = 130;
byte y = (byte) x; // 강제 형변환: 오버플로우 발생 가능
int i = 10;
double d = i; // 자동 형변환: 10 → 10.0
double d2 = 9.99;
int i2 = (int) d2; // 강제 형변환: 9.99 → 9
char는 내부적으로 유니코드 정수로 처리되므로 int와의 형변환이 자주 사용됩니다.
char c = 'A';
int code = c; // char → int : 65
int i = 66;
char ch = (char) i; // int → char : 'B'
boolean 타입은 다른 기본형 타입과 형변환이 불가능합니다.
boolean flag = true;
int num = (int) flag; // 오류 발생
참조형은 상속 관계에 따라 형변환이 가능합니다.
자식 클래스 → 부모 클래스
자동으로 변환됩니다.
class Animal {}
class Dog extends Animal {}
Dog d = new Dog();
Animal a = d; // 자동 형변환 (업캐스팅)
부모 클래스 → 자식 클래스
명시적인 형변환이 필요하며, 실행 시 오류 가능성이 있습니다.
Animal a = new Dog();
Dog d = (Dog) a; // 명시적 형변환 (정상)
Animal a2 = new Animal();
Dog d2 = (Dog) a2; // 실행 시 ClassCastException 발생
다운캐스팅 전에 instanceof 연산자를 통해 타입을 확인하는 것이 좋습니다.
if (a2 instanceof Dog) {
Dog d2 = (Dog) a2;
}
래퍼 클래스 간에는 valueOf, parse, xxxValue() 메서드를 사용하여 형변환합니다.
String str = "123";
int num = Integer.parseInt(str); // 문자열 → 정수
double d = 3.14;
int i = (int) d; // double → int
Integer boxed = Integer.valueOf(100); // int → Integer
int unboxed = boxed.intValue(); // Integer → int
기본형과 래퍼 클래스 간의 변환은 자동으로 일어납니다 (Java 5 이상).
Integer i = 10; // int → Integer (Auto-boxing)
int n = i; // Integer → int (Auto-unboxing)
데이터 손실 주의: 큰 타입에서 작은 타입으로 형변환할 때 값 손실 또는 오버플로우가 발생할 수 있습니다.
문자와 숫자 구분: '1' (char)과 1 (int)은 다르며, 형변환 시 유의해야 합니다.
참조형 변환 시 예외 발생 가능: 잘못된 다운캐스팅은 ClassCastException을 발생시킵니다.
boolean은 다른 타입과 변환 불가: 예외적인 존재로 별도 취급됩니다.
형변환 종류 |
변환 방향 |
필요 여부 |
예시 |
---|---|---|---|
자동 형변환 |
작은 타입 → 큰 타입 |
자동 |
int → long, float → double |
강제 형변환 |
큰 타입 → 작은 타입 |
명시적 필요 |
(int) 3.14, (byte) 130 |
업캐스팅 |
자식 → 부모 클래스 |
자동 |
Dog → Animal |
다운캐스팅 |
부모 → 자식 클래스 |
명시적 필요 |
(Dog) animal |
박싱/언박싱 |
기본형 ↔ 래퍼 클래스 |
자동 |
int ↔ Integer |