varargs 가변인자
java 5부터 등장한 임의의 갯수의 파라미터 타입 (arbitrary number of parameters)
Before Varargs
n개이하의 파라미터가 들어올 가능성이 있다면 n개의 함수를 overwrite해야했다.
public String format() {}
public String format(String v){}
public String format(String v1, String v2){}
Use of Varargs
- 타입과 변수명 사이에 …을 적어주면 varargs 가 된다.
- 실제 함수안에서는 Array형식으로 사용하면 된다.
- 각 메소드는 하나의 varargs만 가질 수 있다.
- varargs는 마지막 파라미터이어야 한다.
public String format(String ... values){} format("hi"); format("hi","hello");
Heap pollution
Generic 타입을 varargs로 사용했을때 경고메시지가 출력된다. warning: [varargs] Possible heap pollution from parameterized vararg type T
(+)Generic Type
모든 타입을 수용하는 파라미터를 가지는 generic class 혹은 generic interface , generic method를 말한다.
-
- Object 타입
- Object로 코드를 작성했을 때에도 모든 타입으로 작성할 수 있다.
public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } }
하지만 컴파일타임에 해당클래스가 어떻게 사용되는지 증명할 방법이 없다. 어떠한 로직에서는 generic class를 Integer로 사용할수있는 반면, 어떠한 로직에서는 generic class를 String 타입으로 사용될 수 있다. 이러할 경우 런타임에러를 발생시킨다.
- Generic 타입
매개변수의 타입은 <>안에 지정하면 된다.
타입은 모든 non-primitive 타입이 될 수 있다
(any class, interface, array, .. )
```java
/**
- Generic version of the Box class.
- @param
the type of the value being boxed */ public class Box { // T stands for "Type" private T t;
public void set(T t) { this.t = t; } public T get() { return t; } }
+ Type Parameter Naming Conventions
* E : Element
* K : Key
* T : Type
* V : Value
* SUV,, : 2nd,3nd,4nd type
3. Diamond
JAVA SE7 후부터 타입을 지정하지않은 <> 가 사용할수있게 되었다.
```java
Box<Integer> integerBox = new Box<>();
[1] java-varargs : https://www.baeldung.com/java-varargs [2] potential heap pollution via varargs parameter : http://reiphiel.tistory.com/entry/potential-heap-pollution-via-varargs-parameter [3] generic types : https://docs.oracle.com/javase/tutorial/java/generics/types.html