Java Type Casting
Java Type Casting: 자바에서의 형 변환
Type Casting은 자바에서 한 데이터 타입을 다른 데이터 타입으로 변환하는 과정을 말합니다. 자바에는 두 가지 유형의 형 변환이 있습니다: 자동 형 변환(Implicit Casting)과 명시적 형 변환(Explicit Casting)입니다.
1. 자동 형 변환 (Implicit Casting)
자동 형 변환은 작은 데이터 타입에서 큰 데이터 타입으로 변환할 때 자동으로 이루어집니다. 즉, 손실 없이 변환할 수 있을 때 컴파일러가 자동으로 처리합니다.
데이터 타입 크기 순서:
byte
→ short
→ int
→ long
→
float
→ double
예시:
public class Main {
public static void main(String[] args) {
int myInt = 9;
double myDouble = myInt; // 자동 형 변환: int에서 double로
System.out.println(myInt); // 출력: 9
System.out.println(myDouble); // 출력: 9.0
}
}
설명:
정수형 int
가 자동으로 부동 소수점형 double
로 변환됩니다. 작은 타입인 int
는 큰 타입인 double
로
변환할 때 데이터 손실이 없으므로 자동으로 형 변환이 이루어집니다.
2. 명시적 형 변환 (Explicit Casting)
명시적 형 변환은 큰 데이터 타입에서 작은 데이터 타입으로 변환할 때 사용됩니다. 이 경우 데이터 손실이 발생할 수 있기 때문에 캐스팅을 명시적으로 수행해야 합니다.
예시:
public class Main {
public static void main(String[] args) {
double myDouble = 9.78;
int myInt = (int) myDouble; // 명시적 형 변환: double에서 int로
System.out.println(myDouble); // 출력: 9.78
System.out.println(myInt); // 출력: 9
}
}
설명:
double
을 int
로 변환하는 경우 소수점 이하가 잘려서 데이터 손실이 발생할 수 있습니다. 이를 방지하기 위해 명시적으로
(int)
라고 캐스팅을 지정합니다.
3. 참조형 변환 (Reference Type Casting)
자바에서 객체 형 변환은 클래스 상속 구조에서 부모 클래스와 자식 클래스 간의 형 변환을 말합니다. 객체 형 변환도 **업캐스팅(Upcasting)**과 **다운캐스팅(Downcasting)**으로 나뉩니다.
업캐스팅 (Upcasting)
자식 클래스 타입의 객체를 부모 클래스 타입으로 변환하는 것은 자동으로 이루어집니다.
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
public void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // 업캐스팅: Dog 객체를 Animal 타입으로
myDog.sound(); // 출력: Dog barks
}
}
다운캐스팅 (Downcasting)
부모 클래스 타입의 객체를 자식 클래스 타입으로 변환하는 것은 명시적으로 해야 하며, 안전하지 않을 수 있습니다.
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
public void sound() {
System.out.println("Dog barks");
}
public void bark() {
System.out.println("Barking...");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // 업캐스팅
Dog myDog = (Dog) myAnimal; // 다운캐스팅
myDog.bark(); // 출력: Barking...
}
}
설명:
다운캐스팅은 캐스팅을 명시적으로 해야 하며, 타입이 맞지 않으면 **ClassCastException
**이 발생할 수 있습니다.
4. 형 변환 예외 (ClassCastException)
잘못된 타입으로 객체를 캐스팅하면 **ClassCastException
**이 발생합니다. 예를 들어, 상속 관계가 없는 클래스들 간의 다운캐스팅 시 발생할 수 있습니다.
class Animal {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Cat();
Dog myDog = (Dog) myAnimal; // 런타임 오류: ClassCastException
}
}
설명:
Cat
객체는 Dog
객체로 변환할 수 없으므로 다운캐스팅이 불가능합니다. 이러한 경우 예외 처리나
instanceof
연산자를 사용하여 캐스팅이 가능한지 확인할 수 있습니다.
5. 형 변환 요약
- 자동 형 변환: 작은 데이터 타입에서 큰 데이터 타입으로 변환. 예:
int
→double
. - 명시적 형 변환: 큰 데이터 타입에서 작은 데이터 타입으로 변환 시
(type)
을 사용. 예:double
→int
. - 업캐스팅: 자식 클래스 객체를 부모 클래스 타입으로 변환. 자동으로 이루어짐.
- 다운캐스팅: 부모 클래스 객체를 자식 클래스 타입으로 변환. 명시적으로 해야 하며, 안전하지 않을 수 있음.
- 형 변환 예외: 잘못된 다운캐스팅을 시도하면
ClassCastException
이 발생.
6. instanceof
연산자
다운캐스팅 전에 객체가 올바른 타입인지 확인하려면 instanceof
연산자를 사용합니다.
if (myAnimal instanceof Dog) {
Dog myDog = (Dog) myAnimal;
myDog.bark();
} else {
System.out.println("Casting not allowed");
}
설명:
instanceof
연산자는 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용됩니다. 다운캐스팅 전에 타입을 확인하여 예외를 방지할 수 있습니다.
요약
Java Type Casting은 데이터 타입을 변환하는 중요한 개념으로, 작은 타입에서 큰 타입으로의 자동 형 변환, 큰 타입에서 작은 타입으로의
명시적 형 변환, 그리고 참조형 타입 변환이 있습니다. 업캐스팅은 자동으로 이루어지지만 다운캐스팅은 명시적으로 수행해야 하며, 캐스팅 전
instanceof
연산자를 사용해 타입 검사를 하면 안전하게 다운캐스팅을 수행할 수 있습니다.