[java] Java, 매개 변수의 3 점

다음 방법에서 3 개의 점은 무엇을 의미합니까?

public void myMethod(String... strings){
    // method body
}



답변

즉, 0 개 이상의 String 객체 (또는 객체의 배열)가 해당 메서드의 인수로 전달 될 수 있습니다.

“임의 인수 수”섹션을 참조하십시오. http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

귀하의 예에서 다음 중 하나로 호출 할 수 있습니다.

myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});

중요 사항 : 이 방법으로 전달 된 인수는 배열이 하나라도 있어도 항상 배열입니다. 분석법 본문에서 그렇게 다루어야합니다.

중요 사항 2 :... 메소드 서명에서 마지막 을 가져 오는 인수 는 마지막이어야합니다. 그래서 myMethod(int i, String... strings)괜찮지 만 myMethod(String... strings, int i)좋아하지 않습니다.

그의 의견에 대한 설명을 해준 Vash에게 감사드립니다.


답변

이 기능을 varargs 라고 하며 Java 5에 도입 된 기능입니다. 이는 함수가 여러 String인수를 수신 할 수 있음을 의미합니다 .

myMethod("foo", "bar");
myMethod("foo", "bar", "baz");
myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array

그런 다음 Stringvar를 배열로 사용할 수 있습니다 .

public void myMethod(String... strings){
    for(String whatever : strings){
        // do what ever you want
    }

    // the code above is is equivalent to
    for( int i = 0; i < strings.length; i++){
        // classical for. In this case you use strings[i]
    }
}

이 답변은 kiswa ‘s와 Lorenzo ‘s .. 그리고 Graphain의 의견에서 많이 차용됩니다.


답변

Varargs입니다 🙂

가변 길이 인수의 짧은 varargs는 메소드가 가변 개수의 인수 (0 이상)를 허용 할 수있는 기능입니다. varargs를 사용하면 가변 개수의 인수를 사용해야하는 메소드를 작성하는 것이 간단 해졌습니다. 변수 인수의 기능이 Java 5에 추가되었습니다.

varargs의 구문

Vararg는 데이터 유형 다음에 3 개의 줄임표 (3 개의 점)로 고정되며 일반적인 형식은

return_type method_name(data_type ... variableName){
}  

Varargs가 필요

Java 5 이전에는 가변 수의 인수가 필요한 경우이를 처리하는 두 가지 방법이있었습니다.

인수의 최대 수, 메소드가 작고 알려진 경우 오버로드 된 메소드 버전을 작성할 수 있습니다. 메소드가 취할 수있는 최대 인수 수가 크거나 알 수없는 경우 접근 방식은 해당 인수를 배열에 넣고 배열을 매개 변수로 사용하는 메소드에 전달하는 것입니다. 이 두 가지 접근 방식은 오류가 발생하기 쉬우 며 매번 매개 변수 배열을 구성하고 유지하기가 어려웠습니다. 새로운 인수를 추가하면 새로운 오버로드 된 메소드가 작성 될 수 있습니다.

Varargs의 장점

훨씬 간단한 옵션을 제공합니다. 오버로드 된 메소드를 작성할 필요가 없으므로 코드가 줄어 듭니다.

varargs의 예

public class VarargsExample {
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 public static void main(String[] args) {
  VarargsExample vObj = new VarargsExample();
  // four args
  vObj.displayData("var", "args", "are", "passed");
  //three args
  vObj.displayData("Three", "args", "passed");
  // no-arg
  vObj.displayData();
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 
Number of arguments passed 3
Three 
args 
passed 
Number of arguments passed 0

프로그램에서 길이가 메소드에 전달 된 인수 수를 찾는 데 사용됨을 알 수 있습니다. varargs가 암시 적으로 배열로 전달되기 때문에 가능합니다. varargs로 전달 된 인수는 varargs에 지정된 이름으로 참조되는 배열에 저장됩니다. 이 프로그램에서 배열 이름은 값입니다. 또한 메소드는 다른 수의 인수로 호출되며, 먼저 4 개의 인수로 호출 한 다음 3 개의 인수로 호출 한 다음 0 개의 인수로 호출합니다. 이 모든 호출은 varargs를 사용하는 동일한 방법으로 처리됩니다.

Varargs를 통한 제한

메소드에 varargs 매개 변수가있는 다른 매개 변수를 가질 수 있지만이 경우 varargs 매개 변수는 메소드가 선언 한 마지막 매개 변수 여야합니다.

void displayValues(int a, int b, int  values) // OK
   void displayValues(int a, int b, int  values, int c) // compiler error

varargs의 또 다른 제한 사항은 varargs 매개 변수가 하나만 있어야한다는 것입니다.

void displayValues(int a, int b, int  values, int  moreValues) // Compiler error

varargs 메서드 오버로드

varargs 매개 변수를 사용하는 메서드를 오버로드 할 수 있습니다. Varargs 메서드는 다음과 같이 오버로드 될 수 있습니다.

vararg 매개 변수의 유형은 다를 수 있습니다. 다른 매개 변수를 추가합니다. varargs 메서드 오버로드 예

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 // Method which has int vararg parameter
 public void displayData(int ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 // Method with int vararg and one more string parameter
 public void displayData(String a, int ... values){
  System.out.println(" a " + a);
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 public static void main(String[] args) {
  OverloadingVarargsExp vObj = new OverloadingVarargsExp();
  // four string args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // One String param and two int args
  vObj.displayData("Test", 20, 30);
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 

Number of arguments passed 2
10 
20

 a Test
Number of arguments passed 2
20 
30 

Varargs 및 오버로드 모호성

varargs 메서드가 오버로드 된 동안 호출이 모호 할 수 있습니다. 예를 보자

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 // Method which has int vararg parameter
 public void displayData(int ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 public static void main(String[] args) {
  OverloadingVarargsExp vObj = new OverloadingVarargsExp();
  // four string args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // This call is ambiguous
  vObj.displayData();
 }
}

컴파일러는 확인이 메서드 호출에 대해인지하지 않기 때문에이 프로그램에서 우리는, displayData ()가 오류가 발생 어떤 매개 변수가없는 메서드 호출을 할 때 displayData(String ... values)또는displayData(int ... values)

같은 vararg방법으로 하나의 유형의 방법이 있고 다른 방법이 vararg동일한 유형의 하나의 매개 변수 및 매개 변수를 갖는 방법을 오버로드하면 동일한 방식으로 모호함-As Exp-
displayData(int ... values)displayData(int a, int ... values)

이 두 가지 오버로드 된 메소드에는 항상 모호성이 있습니다.


답변

이것은 varargs (변수 번호 인수) 를 전달하는 Java 방법 입니다.

C에 익숙한 경우 함수에서 ...사용한 구문 과 비슷 printf합니다.

int printf(const char * format, ...);

그러나 형식이 안전한 방식으로 : 모든 인수는 지정된 형식을 준수해야합니다 (샘플에서 모두는이어야 함 String).

다음은 varargs 를 사용하는 방법에 대한 간단한 샘플입니다 .

class VarargSample {

   public static void PrintMultipleStrings(String... strings) {
      for( String s : strings ) {
          System.out.println(s);
      }
   }

   public static void main(String[] args) {
      PrintMultipleStrings("Hello", "world");
   }
}

...당신이를 통과 할 수 있도록 인수는, 실제로 배열 String[]매개 변수로.


답변

어쨌든 그것은 구문 설탕의 예입니다. 어쨌든 배열로 구현 되었기 때문에 (그것은 쓸모가 없음을 의미하지는 않습니다)-배열을 명확하게 유지하고 주어진 유형의 배열로 메소드를 선언하는 것을 선호합니다. 그러나 대답보다는 의견이 있습니다.


답변

또한 약간의 빛을 비추려면 var-arg 매개 변수가 하나로 제한되고 여러 개의 var-art 매개 변수를 가질 수 없다는 것을 알아야합니다. 예를 들어 이것은 불법입니다.

public void myMethod(String... strings, int ... ints){
// method body
}


답변

params그 배경에서 오는 경우 C # 의 키워드로 생각하십시오. 🙂