인프런 커뮤니티 질문&답변

인프린님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 중급 2편

다형성을 통한 중복 해결 시도

ObejctBox 질문

24.06.18 23:13 작성

·

171

0

안녕하세요.

ObjectBox를 활용하여 int와 String을 받는 과정에서 중복은 해결하였으나 잘못된 타입을 넣을 경우에 대한 예시 들었던 부분에서 질문입니다.

integerBox.set("문자100");
Integer result = (Integer)integerBox.get();

이 부분에서 문의드릴게 실제 컴파일을 하기 전까지는 ide에서 에러라고 인식을 못하던데 왜 그런걸까요 ? get()을 통해 리턴되는게 object 타입이어도 실제 객체가 Integer 객체가 아니면 저렇게 (Integer)로 캐스트 하는 것 부터가 문제가 되야 할 거 같아서요.

감사합니다.

답변 2

0

codesweaver님의 프로필 이미지

2024. 06. 19. 17:33

안녕하세요. 인프린님, 공식 서포터즈 코즈위버입니다.

이는 컴파일러의 한계라고 할 수 있습니다.

integerBox.get()은 반환타입이 Object 입니다. 그리고 이를 강제로 (Integer) 캐스팅 하는 것은 문법상으론 아무 문제가 없습니다. 다만 실제로 시행해봐야 문제가 생기는지 아닌지 알 수 있는 형태의 오류이지요. 이런 오류를 런타임 오류라고 하며 컴파일러가 잡아내지 못하는 경우가 많습니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 18. 23:16

안녕하세요, 인프런 AI 인턴입니다.

인프린님께서 질문하신 ObjectBox와 관련하여 컴파일 시점까지 IDE에서 타입 오류를 인식하지 못하는 이유에 대해 설명드리겠습니다. ObjectBox와 같은 클래스를 사용하면, 모든 타입의 객체를 저장할 수 있게 되는데, 이는 자바의 다형성과 타입 소거(Type Erasure) 특성 때문입니다. get() 메서드는 Object 타입으로 반환되고, 컴파일 시점에서는 저장된 객체의 실제 타입을 확인할 수 없습니다. 따라서, (Integer)integerBox.get() 같은 캐스팅은 런타임에서 ClassCastException을 발생시킬 수 있는 위험이 있습니다.

관련하여 캐스팅과 ClassCastException을 설명하는 답변이 있는데요, 같은 강의에서 구체적으로 ClassCastException과 캐스팅 문제에 대해 해결 방법을 제공하는 캐스팅 관련 질문 있습니다. 질문에서 지식공유자께서 null 캐스팅의 예외 상황을 설명하셨습니다. 여기서는 null값을 다른 참조 타입으로 캐스팅하는 경우에 대한 설명이지만, 비슷하게 질문하신 캐스팅의 개념과 예외 처리 방법에 대한 이해를 돕고자 드립니다.

본문의 질문인 IDE에서 에러 인식 문제는 제네릭의 타입 소거에 의해 실행 시점에서만 실제 객체 타입이 판단되기 때문입니다. 제네릭을 사용하지 않는 경우(예: ObjectBox 사용), 컴파일러가 타입 불일치를 런타임 시점까지 감지하지 못합니다. 이는 자바의 타입 체크가 컴파일 시점에 이루어지며, Object 타입으로는 모든 타입을 받을 수 있기 때문입니다. 실제 타입 불일치가 런타임시에만 발생하는 ClassCastException으로 나타납니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.