Chapter01/Sping boot

@SuppressWarnings( "unchecked" )

EmmaDev_v 2025. 8. 27. 11:48

@SuppressWarnings( "unchecked" )

이런 처음본게 있었다

 

찾아보니까 

@SuppressWarnings 은 

컴파일러 경고를 무시하도록 지시하는 어노테이션이라고한다

 

generics, deprecation, unused

같은 상황에 컴파일 경고가 발생하는데 

의도적으로 경고를 발생시킨것일 수도 있으니

경고를 띄우지 말라는것

 

unchecked는 제네릭 타입 캐스팅과 관련된 경고임

 

 

      ▼ 제네릭 개념 참고▼ ▼ ▼ ▼ ▼ ▼ ▼

https://dev-emma-dev.tistory.com/301

 

[Spring boot] Generic

제네릭이 뭐냐면 이다.가장 중요한 개념은 담을 때는 상관 없고, 꺼낼 때가 중요하다 임. Java 5 부터 사용한 기능인데예시로 보는게 이해가 빠름 ㄱㄱ 제네릭을 사용하지 않는 경우List list = new Arr

dev-emma-dev.tistory.com

 

 

 

 

제네릭 관련된 예를 들면 

List list = new ArrayList(); // raw type
list.add("Hello");

List<String> strList = list; // unchecked warning

 


여기서 컴파일러가 "안전하지 않은 타입 변환이 일어났다(unchecked conversion)" 라는 경고를 띄우는
이때 @SuppressWarnings("unchecked")를 쓰면 이 경고를 무시할 수 있음

 

 

경고를 무시해도 되는 경우와 조심해야 하는 경우는

예를 들어보겠다

 

 

타입캐스팅 무시해도되는경우 (런타임 시점에 타입이 확실히 보장되는 경우)

@SuppressWarnings("unchecked")
public List<User> getUsers() {
    return (List<User>) sqlSession.selectList("UserMapper.getUsers");
}

- MyBatis에서 selectList는 원래 List<?> 같은 걸 반환하지만, 사실상 XML 매핑으로 User 타입이 오는 게 보장됨.

- 컴파일러는 몰라서 경고를 띄우지만, 우리는 확실하다는 걸 알고 있음

 

 

 

 

조심해야하는 경우 (타입이 확실하지않아 무시하면 런타임에서 ClassCastException 이 발생할 수 있음)

@SuppressWarnings("unchecked")
List<String> list = (List<String>) (Object) Arrays.asList(1, 2, 3);

String s = list.get(0);

 

- 즉, 경고는 무시해도 실행은 되지만, 잘못된 타입 변환이면 런타임에서 터진다는 점은 주의

 

(1) Arrays.asList(1, 2, 3)

반환 타입은 List<Integer> 임.

ex. [1, 2, 3]와 같은 List<Integer>

 

(2) (Object) Arrays.asList(1, 2, 3)

강제로 List<Integer> 를 Object로 업캐스팅

이제 타입 정보가 사라져버림. (Object니까 제네릭 정보 없음)

 

(3) (List<String>) (Object) ...

Object를 다시 List<String>으로 다운캐스팅

컴파일러는 “Object가 정말로 List<String> 맞나?”를 확인 못 함

 

=> 그래서 경고(unchecked cast)를 띄우지만, @SuppressWarnings("unchecked")로 무시함

 

 


근데!!!!!!!!!

내가 궁금했던건 이거다

경고라는게 실행에는 문제가없더라도 말 그대로 '경고'인데 정상적인 상태는 아니잖아?

이걸 IDE에서 알려주는건데 의도적으로 이 경고를 무시하겠다? 왜 때문..?

 

 

 

경고를 무시하는 이유는..

 

제네릭 포스팅을 보고 왔으면 알겠지만 Java 5 이전에는 제네릭이 없었고 라이브러리들 대부분이 List, Map 이런식으로

raw type을 썻었다. 지금은 제네릭을 쓰지만 그래도 Mybatis, JPA,JSON 라이브러리들 내부적으로는 Object 기반으로 동작을해서 반환타입이 <?>로 잡힘  개발자 입장에서는 mapper.xml 이나 DTO 를 보고 실제 들어올 type을 알 수 있지만 컴파일러는 이걸 몰라서 경고를 발생시킨다는것 → 개발자는 이미 인지하고있는 내용이니까 경고 꺼줘도 돼! 하고 @SuppressWarnings 쓴다

 

반응형