Be-Developer

varargs 가변인자

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를 말한다.

  1. 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 타입으로 사용될 수 있다. 이러할 경우 런타임에러를 발생시킨다.

  2. 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