반응형
개발하다 보면, Object 타입으로 받은 데이터를 특정 클래스로 형 변환(Casting)하는 과정에서 오류가 발생할 때가 있습니다. 특히, 문자열을 정수 타입으로 단순 변환하려 시도하거나, 컬렉션에서 잘못된 타입을 꺼내올 때 자주 볼 수 있습니다.
1. 문제 상황 코드 예시
아래 코드는 문자열 형태로 저장된 숫자를 강제로 Integer로 변환하려다가 발생한 에러 예시입니다.
public class TypeCastErrorExample {
public static void main(String[] args) {
Object numberString = "123"; // 실제로는 String 타입
// 강제 변환을 시도 (잘못된 캐스팅)
Integer num = (Integer) numberString;
System.out.println("정수 값: " + num);
}
}
2. 발생 오류
위 코드를 실행하면 다음과 같은 오류가 발생합니다:
Exception in thread "main" java.lang.ClassCastException: class java.lang.String
cannot be cast to class java.lang.Integer
...
간단히 말해, String 객체를 Integer로 바로 캐스팅할 수 없어서 생기는 오류입니다.
3. 원인
- ClassCastException: 자바는 런타임 시점에 객체의 실제 타입이 변환하려는 타입과 호환되지 않으면 예외를 던집니다.
- 여기서는 "123"이라는 String 타입 객체가 실제로 Integer 클래스의 인스턴스가 아니기 때문에 변환이 불가능합니다.
4. 해결 방법
- 올바른 방법으로 파싱하기
- 문자열을 정수로 바꾸려면 Integer.parseInt() 등 파싱 메서드를 사용해야 합니다.
-
String numberString = "123"; Integer num = Integer.parseInt(numberString); System.out.println("정수 값: " + num); // 123
- 컬렉션에서 타입을 다룰 때 주의하기
- 제네릭(Generics)을 정확히 선언해, 컴파일 시점부터 타입 안전성을 보장하세요.
- List<Integer> list = new ArrayList<>(); 식으로 작성해서 잘못된 객체가 들어가지 않도록 합니다.
5. 정리
- ClassCastException은 주로 “런타임”에 발생하며, instanceof 연산자나 제네릭을 통해 미리 방지할 수 있습니다.
- 문자열을 숫자로 바꾸려면 반드시 파싱을 거쳐야 합니다.
- 컬렉션 사용 시에는 제네릭을 적극 사용하여 컴파일 시점에 오류를 잡도록 유도하는 것이 좋습니다.
- 자바는 깐깐한 언어이다.
위 과정을 숙지하고, 항상 실제 객체의 타입과 캐스팅하려는 타입을 정확히 확인한다면, 개발 중 만날 수 있는 타입 변환 오류를 손쉽게 예방할 수 있습니다.
반응형
'자바' 카테고리의 다른 글
[자바 초보자를 위한] 간단한 학생 성적 계산 프로그램 만들기 (2) | 2024.04.24 |
---|---|
자바 클래스 타입 확인 (1) | 2023.09.04 |
[Java] cannot be cast to java.lang.String 해결 (0) | 2023.06.26 |
jdk-설치 (0) | 2022.09.21 |
제네릭 (0) | 2021.04.07 |
댓글