ClassCastException(클래스 캐스팅 오류)란 무엇인가?
1. ClassCastException이란?
ClassCastException은 Java에서 객체의 형 변환(Casting) 중에 발생하는 런타임 예외입니다. 이 예외는 객체를 하위 클래스나 상위 클래스로 변환할 때 잘못된 타입으로 캐스팅을 시도할 경우 발생합니다. 예를 들어, 부모 클래스의 인스턴스를 자식 클래스로 캐스팅하려는 경우 발생할 수 있습니다.
2. ClassCastException이 발생하는 이유
이 예외는 다음과 같은 상황에서 주로 발생합니다:
- 잘못된 객체 캐스팅: 상속 관계에 있지 않은 두 클래스 간에 형 변환을 시도할 때 발생합니다.
- 업캐스팅과 다운캐스팅: 상위 클래스로부터 파생된 하위 클래스 객체를 상위 클래스 타입으로는 캐스팅할 수 있지만, 그 반대로는 적절한 형 확인 없이 다운캐스팅을 시도할 경우 예외가 발생할 수 있습니다.
3. ClassCastException 예시
3.1 잘못된 캐스팅 예시
아래 예시는 ClassCastException
이 발생하는 간단한 예시입니다. 상위 클래스 객체를 하위 클래스 타입으로 캐스팅하려고 할 때 발생합니다.
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Dog dog = (Dog) animal; // ClassCastException 발생
dog.sound();
}
}
위 코드에서는 Animal
객체를 Dog
타입으로 잘못 캐스팅하려고 하면서 ClassCastException
이 발생합니다. animal
객체는 실제로 Dog
의 인스턴스가 아니기 때문에 이 예외가 발생합니다.
3.2 올바른 캐스팅 예시
다음은 올바르게 캐스팅된 예시입니다. 객체가 실제로 하위 클래스의 인스턴스일 때만 캐스팅을 수행합니다.
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // Dog 타입 객체 생성
Dog dog = (Dog) animal; // 안전한 캐스팅
dog.sound(); // "Dog barks" 출력
}
}
이 코드에서는 animal
객체가 실제로 Dog
인스턴스이므로 안전하게 Dog
타입으로 캐스팅할 수 있습니다.
4. ClassCastException을 해결하는 방법
ClassCastException
을 방지하고 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다:
- instanceof 키워드 사용: 객체가 특정 타입인지 확인한 후에 캐스팅을 시도하는 것이 좋습니다.
instanceof
를 사용하면 객체의 실제 타입을 확인하여 예외 발생을 방지할 수 있습니다. - 타입 체크: 컬렉션이나 제네릭을 사용할 때, 객체의 타입을 미리 명확히 정의하는 것이 중요합니다. 이는 형 변환 오류를 방지하는 데 큰 도움이 됩니다.
4.1 instanceof 키워드 사용 예시
instanceof
키워드를 사용하여 객체가 특정 클래스의 인스턴스인지 확인하고 캐스팅을 진행하는 방법입니다.
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 안전한 캐스팅
dog.sound();
} else {
System.out.println("animal은 Dog 타입이 아닙니다.");
}
}
}
이 코드에서는 instanceof
를 사용하여 객체가 Dog
타입인지 확인한 후 캐스팅을 시도하기 때문에 ClassCastException
이 발생하지 않습니다.
5. 제네릭을 사용한 ClassCastException 방지
Java의 제네릭 기능을 사용하면 형 변환 오류를 방지할 수 있습니다. 제네릭은 컴파일 시점에 타입을 검사하므로, 런타임 오류를 줄이는 데 큰 도움이 됩니다.
5.1 제네릭 사용 예시
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("World");
for (String item : list) {
System.out.println(item);
}
}
}
위 예시에서는 List
에 저장되는 객체의 타입이 String
으로 지정되어 있기 때문에 형 변환 오류가 발생하지 않습니다.
6. 결론
ClassCastException은 Java에서 객체를 잘못된 타입으로 캐스팅하려고 할 때 발생하는 런타임 예외입니다. 이 예외를 방지하기 위해서는 instanceof
키워드를 사용하여 객체의 타입을 확인하거나, 제네릭을 사용하여 타입 안전성을 보장하는 것이 좋습니다. 또한, 캐스팅 전 객체의 실제 타입을 명확히 이해하고 코드를 작성하는 것이 중요합니다.