sumNumber()메서드는 int전달 된 매개 변수 의 합계를 반환합니다 (전달 된 인수의 수는 중요하지 않음).
보시다시피, varargs는 어떤 상황에서는 정말 유용 할 수 있습니다. 그러나 메서드에 전달 된 인수의 수가 확실하면 대신 메서드 오버로드를 사용합니다. 예를 들어, sumNumber()메소드가 2 또는 3 인수의 합계를 계산하는 데에만 사용 된다는 것이 확실 하면 첫 번째 예와 같이 오버로드를 사용하십시오.
다른 예를 들면 jdk에 포함된 String.format() 메소드도 있다.
1 2 3 4 5
publicstatic String format(String format, Object... args){ returnnew Formatter().format(format, args).toString(); }
실행 예는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
package com.github.sejoung.codetest.vararg;
publicclassCompany{ publicstaticvoidmain(String[] args){ String siteName = "programiz.com"; int empCount = 6; String type = "tutorial website"; System.out.println( String.format( "Site Name : %s, Emp Count: %d Type: %s", siteName, empCount, type ) ); } }
실행결과
1 2 3 4 5
Site Name : programiz.com, Emp Count: 6 Type: tutorial website
Process finished with exit code 0
가변인자가 작동하는 방법은?
아래의 pseudo code를 보면
1 2 3 4 5
publicintsumNumber(int ... nums){ // method body }
…구문은 방법은 0 개 이상의 인수로 호출 할 수있는 자바 컴파일러를 알려줍니다. 결과적으로 num 변수는 암시 적 으로 유형 의 배열 로 선언됩니다 int[ ]. 따라서 메서드 내에서 nums 변수는 배열 구문을 사용하여 액세스됩니다.
privatevoidtest(int n, int ... vargs){ System.out.println("두번째"); }
publicstaticvoidmain(String[] args){ Demo demo = new Demo();
demo.test(1,2,3,4);
} }
위의 프로그램에서 메소드가 오버로드되고 다른 수의 인수를 허용 test()하더라도 test()메소드 를 호출하려고하면 컴파일러가 혼란스러워집니다 .
컴파일러는 호출 할 메소드를 알지 못합니다. 컴파일러는 test(int … vargs)하나의 varargs 인수를 사용 하여 호출하려고한다고 생각할 수 있습니다 . 또한 컴파일러는 test(int n, int … vargs)빈 매개 변수 두 번째 매개 변수를 사용하여 첫 번째 매개 변수에 전달 된 인수 로 호출하려고한다고 생각할 수 있습니다 .
두 가지 가능성이 있으므로 모호성이 발생합니다. 이 때문에 때때로 varargs 메소드를 오버로드하는 대신 두 개의 다른 메소드 이름을 사용해야 할 수도 있습니다.