```
자바에서 @SafeVarargs 사용하는 한 가지 방법
```
이번 글을 통해 배워갈 내용
- @SafeVarargs 정의
- @SafeVarargs Annotation 예시
Annotation이란
https://codemasterkimc.tistory.com/397
@SafeVarargs 정의
Java 1.5부터 지원되는 non-reifiable variable arity (vararg)에 대해서
Java 1.7 부터 @SafeVarargs를 이용해서 안전하다는 표시를 개발자가 함으로써 컴파일러 경고를 무시하게 해 줍니다.
이는 개발자가 안전하지 않은 곳에 @SafeVarags를 쓰면 문제가 발생한다는 이야기입니다.
@SafeVarargs Annotation 예시
CatVarag 클래스
Heap Pollution을 무시합니다.
public class CatVarag {
@SafeVarargs // 안전하지 않아도 Possible heap pollution from parameterized vararg type 을 무시
static void m(List<String>... strList) {
Object[] arr = strList;
List<Integer> intList = Arrays.asList(10);
arr[0] = intList; // 힙 오염
String s = strList[0].get(0); // 런타임에 ClassCastException 발생
}
}
App 클래스
public class App {
public static void main(String[] args) {
CatVarag c = new CatVarag();
c.m();
}
}
실행하면 예외가 발생합니다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at com.bj.hello.CatVarag.m(CatVarag.java:11)
at com.bj.hello.App.main(App.java:6)
이는 타입 안전성이 깨지는 상황 즉 제네릭 varargs 배열 매개변수에 값을 저장하는 상황에서
개발자가 @SafeVarargs을 써두었기 때문입니다.
결론은
안전하지 않은 곳에는 절대 @SafeVarargs를 쓰면 안 됩니다.
참조
https://www.baeldung.com/java-safevarargs
https://docs.oracle.com/javase/8/docs/api/java/lang/SafeVarargs.html
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'Java > Java 기타' 카테고리의 다른 글
JAVA로 점을 가진 문자열 나누는 방법 (0) | 2022.08.23 |
---|---|
Clean Code에 대한 김씨의 1가지 생각 (0) | 2022.05.26 |
자바에서 @FunctionalInterface 사용하는 한 가지 방법 (0) | 2022.05.21 |
자바에서 @SupressWarnings 사용하는 한 가지 방법 (0) | 2022.05.21 |
자바에서 @Deprecated 사용하는 한 가지 방법 (0) | 2022.05.21 |