자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
ClassCastException 예외 발생 예제
ArrayList list = new ArrayList();
list.add(10); // Integer
list.add(20); // Integer
list.add("30"); // String
Integer i = (Integer)list.get(2); // 형변환 시도
❗ 핵심 포인트
- ArrayList를 제네릭 없이 생성하면 내부 타입은 Object로 처리됩니다.
- list.add(10)과 list.add(20)은 Integer 객체를 넣은 것이고,
- list.add("30")은 String 객체를 넣은 것입니다.
- 그런데 list.get(2)으로 꺼낸 "30"을 Integer로 강제 형변환(casting) 했습니다.
- 이 경우 컴파일 오류는 나지 않지만, 실행 중에 ClassCastException이 발생합니다.
📌 이유:
"30"은 String인데, Integer로 캐스팅할 수 없기 때문입니다.
제네릭을 사용한 코드
ArrayList<Object> list = new ArrayList<Object>();
list.add(10); // Integer
list.add(20); // Integer
list.add("30"); // String
String i = (String)list.get(2); // 형변환 가능
설명
- <Object> 타입의 제네릭을 사용했기 때문에 모든 타입을 넣을 수 있습니다.
- 이 경우 list.get(2)는 Object 타입이므로, String으로 형변환이 가능함.
- 이때 "30"은 실제로 String 타입이므로 형변환이 정상 작동합니다.
📌 주의:
Object 타입으로 받았기 때문에 여전히 형변환이 필요하고, 타입이 틀리면 런타임 오류가 납니다.
제네릭이 필요한 이유와 효과
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 에러: Audio는 Tv가 아님
설명
- 제네릭을 사용하면 컴파일 타임에 타입 검사를 강화합니다.
- ArrayList<Tv>는 Tv 객체만 넣을 수 있고, 다른 타입은 컴파일 오류가 납니다.
- tvList.get(0)으로 꺼낸 값을 따로 캐스팅하지 않아도 됩니다. (Tv t = tvList.get(0);)
❗ 제네릭을 쓰지 않은 경우
ArrayList tvList = new ArrayList();
tvList.add(new Tv());
Tv t = (Tv)tvList.get(0); // 직접 캐스팅 필요
- 모든 객체가 Object로 처리되므로 형변환이 반드시 필요하고,
- 실수로 Audio 같은 다른 타입을 넣고 Tv로 캐스팅하면 런타임 오류 발생 (ClassCastException)
예외 계층도와 ClassCastException
주요 예외 설명
- Exception → RuntimeException → ClassCastException
- RuntimeException은 컴파일 시 체크되지 않음. 실행 중에 발생.
- ClassCastException은 형변환을 잘못했을 때 발생하는 예외
기타 예외들도 설명:
- NullPointerException: null에 접근
- ArithmeticException: 0으로 나누기
- IndexOutOfBoundsException: 배열/리스트 인덱스 초과
요약 정리
구분 | 제네릭 사용 전 | 제네릭 사용 후 |
타입 체크 | 실행 시 | 컴파일 시 |
형변환 필요 | 필요 (Object → 원래 타입) | 불필요 (자동 타입 안전 보장) |
안정성 | 낮음 (ClassCastException 위험) | 높음 |
코드 가독성 | 낮음 | 높음 |
'Java' 카테고리의 다른 글
지네릭 다형성 (0) | 2025.06.25 |
---|---|
타입 변수 (0) | 2025.06.25 |
컬렉션 클래스 정리 & 요약 (0) | 2025.06.24 |
Colections의 메서드 (0) | 2025.06.24 |
HashMap (0) | 2025.06.24 |