Java/JAVA 100 문제 풀이

자바 part.5 문제풀이 - 제네릭을 사용하지 않을 때 자바에서 발생하는 실행 시점 오류

진이최고다 2023. 7. 31. 23:36
예제
class Person{
	//Field
	public Object obj;
	
	//Constructor
	Person(Object obj){
		this.obj = obj;
	}
}

class Student{
	//Field
	public int grade;
	//Constructor
	Student(int grade){
		this.grade = grade;
	}
}

class Teacher{}

public class Collection_Generic02 {
	
    public static void main(String[] args) {
    	
    	//[1] : 객체생성
    	Person p1 = new Person("안녕하세요");
    	String str = (String)p1.obj;
    	System.out.println(str.length());
    	
    	Person p2 = new Person(new Student(1));
    	Teacher t = (Teacher) p2.obj;  // 실행 시점에서 ClassCastException 발생
    }
}

1. 자바에서 타입 캐스팅과 실행 시점 오류 

"Person" 클래스에는 "Obejct" 타입의 "obj" 필드가 있고, 이 필드를 초기화하는 생성자가 있다. 메인 메서드에서는 "Person" 객체를 생성하고 "obj" 필드에 문자열을 저장하며, 이를 "String" 으로 캐스팅하고 있다. 현재는 문제 없어 보이지만 "obj"에 다른 타입의 객체를 저장하게 되면 실행 시점에서 오류가 발생하게 된다.

 

"Person" 객체의 "obj" 필드에 저장할 수 있는 데이터 타입은 어떤 것이든 가능하다. 이 때문에 "Person" 객체를 생성할 때는 반드시 어떤 타입의 데이터가 "obj" 필드에 저장되는지 정확히 알아야 한다. 만약 잘못된 타입으로 캐스팅을 시도하면 실행 시점에서 "ClassCastException" 이 발생한다.

 

2. 제네릭을 사용하지 않는 경우 실행 단계에서 오류 발생

"Person" 객체의 "obj" 필드에 "Student" 객체를 저장하고 이를 "Teacher" 객체로 캐스팅하는 경우, 컴파일 단계에서는 오류가 발생하지 않지만, 실행 단계에서 "ClassCastException" 이 발생하게 된다.

Person p2 = new Person(new Student(1));
Teacher t = (Teacher) p2.obj;  // 실행 시점에서 ClassCastException 발생

 이 코드에서 "Person" 객체의 "obj" 필드에 " Student" 객체를 저장했지만 이를 "Teacher" 로 캐스팅하려고 했다. "Student" 객체는 "Teacher" 로 캐스팅할 수 없기 때문에 실행 단계에서 "ClassCastException" 이 발생한다.