새벽까지

문제의 코드

    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
profile

새벽까지

@GoS

좋아요❤️ 구독👍🏻 감사합니다!