Java/Java 기타

자바에서 @SafeVarargs사용하는 한 가지 방법

kimc 2022. 5. 21. 11:41

```

자바에서 @SafeVarargs 사용하는 한 가지 방법

```

이번 글을 통해 배워갈 내용

  1. @SafeVarargs 정의
  2. @SafeVarargs Annotation 예시

 


 

Annotation이란

https://codemasterkimc.tistory.com/397

 

자바 Annotation의 정의와 종류 그리고 사용 예시

``` Annotation의 정의 Annotation의 종류 Annotation의 사용 예시 ``` 이번 글을 통해 배워갈 내용  Annotation의 정의  Annotation의 종류  Annotation의 사용 예시 Annotation의 정의 Annotation은 메타데..

codemasterkimc.tistory.com

 

 

@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://stackoverflow.com/questions/14231037/java-safevarargs-annotation-does-a-standard-or-best-practice-exist

 

Java SafeVarargs annotation, does a standard or best practice exist?

I've recently come across the java @SafeVarargs annotation. Googling for what makes a variadic function in Java unsafe left me rather confused (heap poisoning? erased types?), so I'd like to know a...

stackoverflow.com

https://www.baeldung.com/java-safevarargs

 

Java @SafeVarargs Annotation | Baeldung

Learn about the @SafeVarargs annotation in Java

www.baeldung.com

https://docs.oracle.com/javase/8/docs/api/java/lang/SafeVarargs.html

 

SafeVarargs (Java Platform SE 8 )

A programmer assertion that the body of the annotated method or constructor does not perform potentially unsafe operations on its varargs parameter. Applying this annotation to a method or constructor suppresses unchecked warnings about a non-reifiable var

docs.oracle.com

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

728x90