문제의 코드
static List<Book>books = new ArrayList<>();
@Override
public Book[] getList() {
return (Book[])books.toArray();
}
이러한 코드를 Book에서 불러왔는데 ClassCastException 오류가 생겼다.
컴파일시에는 아무런 문제가 없다.
toArray() 메소드의 반환은 Object[]이다.
Object[] -> Book[]
Book[]조상인 Object[]를 형변환했는데 왜 이런 문제가생겼을까?
Example
예를들어 이러한 코드가있다.
Object[] objectArray = new Object[3];
objectArray[0] = new Person("Alice", "1234", 25);
objectArray[1] = "Hello"; // 문자열도 Object의 하위 클래스이므로 배열에 저장 가능
objectArray[2] = new Car("Toyota", "123ABC"); // 다른 클래스의 객체도 저장 가능
Person[] personArray = (Person[]) objectArray; // 잘못된 형변환 시도
Object배열은 모든 객체를 담을 수 있다.
objectArray에는 Person 객체 외에도 다른 객체들이 있으므로 Person[]으로 강제 형변환하면 문제가 생긴다.
Object[]을 형변환하는 것은 자바에서 안전하지 않다고 생각을해서 ClassCastException이 뜨는거 같다.
바꾼 코드
static List<Book>books = new ArrayList<>();
@Override
public Book[] getList() {
return books.toArray(new Book[books.size()]);
}
toArray 메소드 안에 Book 새로운 객체를 만드는 것을 권장한다.
'개발일지-TIL > JAVA' 카테고리의 다른 글
equals 오버라이드 NullPointException 문제 (0) | 2023.07.26 |
---|