inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

이펙티브 자바 완벽 공략 2부

아이템 28. 핵심 정리 2

아이템 28 타입 안전

440

janhoy

작성한 질문수 5

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

아이템 28 마지막 요약에 제네릭은 불공변이고 타입 정보가 소거된다. 그 결과 배열은 런타임에는 타입 안전하지만 컴파일 타임에는 그렇지 않다. 제네릭은 반대다. 라고 적혀있는데
배열이 런타임에 타입 안전하다는게 이해가 잘 안됩니다.


Object[] objectArray = new Long[1];
/* ArrayStoreException 발생 */ 
objectArray[0] = "타입이 달라 넣을 수 없음"; //ArrayStoreExcpetion

위 코드 처럼 공변되면서 런타임에 에러가 나는데 저장 했을때 저장 시점에 에러를 반환하면 타입 안전하다고 하는건가요?

public class Chooser<T> {
    private final T[] choiceArray;

    public Chooser(Collection choices) {
        choiceArray = (T[]) choices.toArray();
    }

    public T choose() {
        return choiceArray[0];
    }

    public static void main(String[] args) {
        Collection<Integer> choices = new ArrayList<>();
        choices.add(1);
        choices.add(2);
        choices.add(3);

        Chooser<String> chooser = new Chooser<>(choices);
        System.out.println(chooser.choose()); //ClassCastException
    }
}

제네릭은 저장 시점에는 잘못된 형식의 데이터가 들어갔는지 런타임에 검사 할 수 없기 때문에 런타임 시점에 안전하지 않다고 하는건가요?




java

답변 1

0

인프런 AI 인턴

안녕하세요 exem.tr3 님, 인프런 AI 인턴이에요.

배열은 런타임에 타입 안전하지 않은 것은 맞습니다. 위의 예시에서 Object[] objectArray = new Long[1];와 같이 배열을 생성하면, 컴파일 시에는 타입 체크가 이루어지지 않기 때문에 Long 배열에 String을 저장하려고 하면 ArrayStoreException이 발생합니다. 이와 같은 경우에는 런타임에 에러가 발생하여 타입 안전하지 않다고 할 수 있습니다.

제네릭은 저장 시점에 잘못된 형식의 데이터가 들어갔는지 런타임에는 검사 할 수 없기 때문에 런타임 시에는 타입 안전하지 않다고 할 수 있습니다. 예를 들어, Chooser<String> chooser = new Chooser<>(choices);에서 choices에는 Integer 타입의 요소가 들어있지만, Chooser 객체를 생성할 때는 String 타입으로 지정하였기 때문에 ClassCastException이 발생합니다.

이는 제네릭은 컴파일 시에 타입 체크를 수행하고 런타임에는 제네릭 타입을 소거하여 Object 타입으로 취급하기 때문에 발생하는 문제입니다. 저장 시에 형식이 유효한지 검사하지 않기 때문에 런타임에 타입에 관련된 오류가 나타날 수 있습니다.

감사합니다.

네이버 API | '검색 - 책' API 제공 중단

0

11

0

ArticleReadService 관련 질문

0

8

0

kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.

1

28

1

이론 공부법 요약본 버전 업데이트 문의

0

11

1

domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다

1

20

1

해당 프로젝트를 똑같이 따라하려니 spring installer가 버전이 17부터 가능하네요.

0

11

1

Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.

0

25

2

테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.

0

13

1

Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면

1

56

1

리뉴얼 시기

0

32

2

스크립트에 대해 질문 있습니다.

1

50

1

같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!

2

53

1

조건 검색 질문

0

31

1

JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문

0

46

3

클로드코드 명령어-대화&세션관리 수업 자료

0

37

1

정처기 필기 준비할때 이 이론을 다시 외워도 될까요?

0

52

2

PlatformTransactionManager, ResourcelessTransactionManager 질문

1

58

2

자료 한번에 다운받기

0

29

1

강의 소스 코드 관련 질문 드립니다.

0

59

1

아이템19 - 구체 클래스가 표준 인터페이스를 구현하지 않았는데 상속을 금지하면 사용하기에 상당히 불편해진다.

1

467

2

다음 강의 질문

0

456

1

아이템16, 조금 애매한 것 같습니다.

0

610

1

아이템 32. 핵심 정리 12:00 이 부분에서 질문이 있습니다.

1

515

1

아이템31 비한정적와일드카드

1

384

0