Java

지네릭스

1space 2025. 6. 25. 08:52

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.

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