자바에서 형변환(Type Casting)이란, 변수나 값의 데이터 타입을 다른 타입으로 바꾸는 것. 형변환은 크게 두 가지로 나뉜다. 실제 값의 형태와 크기를 바꾸는 '기본형(Primitive Type) 변환'과 객체를 가리키는 참조 변수의 타입을 바꾸는 '참조형(Reference Type) 변환'이다.
Int, double, char 등 8개 기본 데이터 타입 사이에서 일어나는 변환. 이것은 다시 두 가지로 구분된다.
double doubleValue = 3.14;
int intValue = (int) doubleValue; // double(8) -> int(4), 강제 변환
System.out.println(intValue); // 출력: 3 (소수점 이하 데이터 손실 발생)
int intValue2 = 300;
byte byteValue = (byte) intValue2; // int(4) -> byte(1), 강제 변환
// byte의 표현 범위(-128 ~ 127)를 초과하여 데이터 손실(overflow) 발생
System.out.println(byteValue); // 출력: 44 (예상치 못한 값)
String, Animal 등 클래스로 생성된 객체를 가리키는 참조 변수(리모컨)의 타입을 변환하는 것. 상속 관계에 있는 클래스 사이에서만 변환이 가능하다.
핵심: 참조형 변환은 힙(Heap) 메모리의 실제 객체를 바꾸는 것이 아니라, 그 객체를 가리키는 참조 변수(리모컨)가 사용할 수 있는 멤버의 범위를 조절하는 것이다.
자식 클래스 타입의 참조 변수를 부모 클래스 타입의 참조 변수로 변환하는 것.
특징
-업캐스팅된 참조 변수는 부모 클래스에 정의된 멤버에만 접근할 수 있다.
-자식 클래스에서 오버라이딩한 메서드가 있다면, 호출 시 재정의된 메서드가 실행된다. (다형성)
class Animal {
void cry() {
System.out.println("동물이 웁니다.");
}
}
class Cat extends Animal {
@Override
void cry() {
System.out.println("야옹!");
}
void grooming() {
System.out.println("그루밍을 합니다.");
}
}
// 업캐스팅
Animal animal = new Cat(); // Cat 타입이 Animal 타입으로 자동 형변환
animal.cry(); // 실행 결과: "야옹!" (오버라이딩된 메서드 실행)
// animal.grooming(); // 컴파일 에러! Animal 리모컨에는 grooming() 버튼이 없음
부모 클래스 타입으로 업캐스팅되었던 참조 변수를 다시 원래의 자식 클래스 타입으로 변환하는 것. 부모 타입 리모컨을 자식 타입 리모컨으로 바꾸어 자식 클래스에만 있는 멤버에 접근하기 위해 사용된다.
특징
-반드시 명시적으로 (변환할 자식 타입)을 지정해야 한다.
-실제 가리키는 객체가 변환하려는 자식 타입이 아닐 경우, ClassCastException이라는 런타임 오류가 발생할 수 있다.
-따라서 변환 전 instanceof 연산자로 실제 객체의 타입을 확인하는 것이 안전하다.
Animal animal = new Cat(); // 업캐스팅된 상태
// 안전하지 않은 다운캐스팅 (오류 가능성 있음)
// Cat cat = (Cat) animal;
// 안전한 다운캐스팅 (instanceof 사용)
if (animal instanceof Cat) {
Cat cat = (Cat) animal; // Cat 타입으로 강제 형변환
cat.cry(); // 실행 결과: "야옹!"
cat.grooming(); // 실행 결과: "그루밍을 합니다." (이제 grooming() 메서드 접근 가능)
}
- instanceof 연산자
자바의 연산자 중 하나로, 참조 변수가 가리키는 실제 객체(인스턴스)가 특정 클래스 타입이나 인터페이스 타입인지 확인하는 데 사용된다. 결과는 true 또는 false의 boolean 값으로 반환된다.참조_변수 instanceof 확인할_타입(클래스 또는 인터페이스)