Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4주차] 이시윤_Item27 #18

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions 5장_제네릭/아이템_27/비검사_경고를_제거하라.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# 아이템 27. 비검사 경고를 제거하라

제네릭을 사용하기 시작하면 수많은 **비검사 경고**를 마주친다.

경고는 `warning: [unchecked]`로 나타난다.

제네릭을 사용할 때 타입을 지정하지 않으면 컴파일러가 비검사 경고를 발생시킨다.

## ✔️ 비검사 경고(Unchecked Warning)란?

> 컴파일러가 코드에서 **타입 안정성**을 검사하지 못하는 상황을 감지하여 발생하는 경고

<mark style="background-color: rgba(255, 255, 0, 0.3);">**할 수 있는 한 모든 비검사 경고를 제거해야 한다**</mark>

➡️ 타입 안정성 보장

➡️ 런타임에 ClassCastException 발생 X

➡️ 개발자의 의도대로 동작

<hr>

## ✔️ @SuppressWarnings("unchecked")

<mark style="background-color: rgba(255, 255, 0, 0.3);">경고를 제거할 수 없지만, <u>타입이 안전하다고 확신할 수 있다면</u> 경고를 숨기자!</mark>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 타입이 안전하다는 확신을 얻기 위해 어떤 검증들을 해보는 게 좋은지 궁금합니다!


➡️ 새로운 경고와 안전한 비검사 경고를 구분

- <mark style="background-color: rgba(255, 255, 0, 0.3);">`@SuppressWarnings`는 항상 **가능한 좁은 범위에 적용**해야 한다.</mark>
- ex) 변수 선언, 한 줄이하의 짧은 메서드, 생성자 등
- 한 줄이 넘는 메서드 or 생성자라면, 지역변수 선언으로 애노테이션을 옮기자.
- <mark style="background-color: rgba(255, 255, 0, 0.3);">사용할 때는 **경고를 무시해도 되는 이유를 주석으로 반드시** 남겨야 한다.</mark>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@SuppressWarnings를 사용할 때, 경고를 무시해도 되는 이유를 주석으로 남겨야 한다고 했는데, 구체적인 예시가 있을까요?


```java
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 개인적으로 경고를 무시해서 "안전한" 경우는 거의 없다고 생각합니다. 그래서 @SuppressWarnings 를 지양하는 편인데요!
혹시 경고를 무시하는게 좀 더 나은 경우가 있나요??

public class SafeTypeConversionExample {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add("Hello");

//안전한 형변환
//String은 Object의 자식
@SuppressWarnings("unchecked")
String value = (String) list.get(0);
System.out.println(value);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약 List<Object>를 그대로 사용하고 싶고,

list.add(1);
int intValue = (int) list.get(1);

이런 코드를 추가하고 싶다면
@SuppressWarnings("unchecked") 를 메서드 레벨로 빼야 할까요? 아니면 int intValue = (int) list.get(1); 이 위에 달아야할까요? 의견이 궁금합니다 :)

}
}
```