본문 바로가기
JAVA/JAVA

[Java] uses unchecked or unsafe operations 에러 해결

by 개미가되고싶은사람 2024. 10. 14.

해당 오류를 몇 번 경험해본 적이 있는데, 문득 자바에서는 해당 오류를 경고 메시지만 보여주는 이유가 궁금해져서 자세히 알아보려고 합니다.

 

1. uses unchecked or unsafe operations. 에러 원인

해당 경고는 제네릭이 필요한 자료형이나 객체를 사용할 때, 제네릭 자료형을 명시하지 않아서 발생합니다. 이로 인해 타입 안전성이 보장되지 않고 ClassCastException오류가 발생할 수 있습니다.

 

2. 해결 방법

해결 방법은 간단합니다. 제네릭이 필요한 부분에 적절한 자료형을 명시해 주시면 해당 오류를 쉽게 해결할 수 있습니다. 

-----------------------해결 전 ----------------------
@SpringBootApplication
public class GeneApplication {

    public static void main(String[] args) {
        List list = new ArrayList<>();
        list.add("test");
        SpringApplication.run(GeneApplication.class, args);
    }
}

-----------------------오류 해결 ----------------------
@SpringBootApplication
public class GeneApplication {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("test");
        SpringApplication.run(GeneApplication.class, args);
    }
}

 

 

그렇다면 해당 오류가 발생했는데 빌드가 되는 이유는 무엇일까??

자바에서 경고 메시지만 발생하는 이유는 기존의 비제네릭 코드와의 호환성을 유지하기 위해서입니다. 제네릭을 사용하지 않는 코드와의 호환성을 고려하여,  경고 메시지를 통해 잠재적인 문제를 알려줍니다.

 

 

그럼 해당 오류는 무시해도 되는 오류일까???

해당 경고 메시지는 ClassCastException이 발생할 수 있는 가능성이 있으며, 타입 안정성이 보장되지 않았음을 나타내므로 이를 무시하는 것은 신중해야 합니다. 만약 코드가 안전하고 문제가 없다고 판단된다면, @SuppressWarnings("unchecked") 애노테이션을 사용하여 경고 메시지를 억제할 수 있습니다. 그러나 이 애노테이션은 타입 안정성이 확실할 때만 사용하는 것이 좋습니다.

@SuppressWarnings("unchecked")를 사용한 경우, 그 이유를 주석으로 남기는 것이 중요합니다. 주석을 통해 다른 개발자들이 경고를 무시한 이유를 명확히 이해할 수 있도록 설명해 주는게 좋습니다.

@SpringBootApplication
public class GeneApplication {

    // 제네릭에 자료형 명시하지 않은 이유: xxxx 
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        List list = new ArrayList<>(); 
        list.add("test");
        SpringApplication.run(GeneApplication.class, args);
    }
}

 

 

결론

  • 무점검 경고(unchecked warning)는 무시하면 안된다 ❌❌
  • 모든 무점검 경고는 애플리케이션 실행 도중에 ClassCastException이 발생할 가능성이 있다.
  • 무점검 경고 메시지는 최선을 다해 제거해라
  • 경고를 제거할 수 없으나 형 안전성을 보장한다는 사실을 입증할 수 있다면 @SuppressWarnings(“unchecked”) 어노테이션을 사용하되, 적용 범위는 최소화해야 한다. 경고 메시지를 억제한 경우, 그 이유를 반드시 주석에 써야 한다.

 

참고자료

[1] - https://blog.naver.com/ollala5276/222611554820?