programing

Java에서 파라미터 유형 옆에 있는 3개의 점은 무엇을 의미합니까?

yoursource 2022. 8. 9. 21:58
반응형

Java에서 파라미터 유형 옆에 있는 3개의 점은 무엇을 의미합니까?

3번 뒤에 죠?String음음음음음음?

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

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

다음 URL의 "임의 인수 수" 섹션을 참조하십시오.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"});

중요사항:이 방법으로 전달되는 인수는 1개라도 항상 배열입니다.메서드 본문에서는 반드시 이와 같이 취급해 주십시오.

중요2: 다음 조건을 충족시키는 인수...메서드 시그니처의 마지막이어야 합니다.so,는,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

다음 '어,어,어,어,어,어 하다'를 사용하면 됩니다.String다음 중 하나:

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

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

이 대답은 키스와와 로렌조의...Graphain의 댓글도 있어요.

바라그스입니다 :)

variable-length 인수의 줄임말인 vararargs는 메서드가 변수 수(0 이상)를 받아들일 수 있는 기능입니다.varargs를 사용하면 다양한 수의 인수를 사용할 필요가 있는 메서드를 쉽게 작성할 수 있습니다.variable 인수 기능은 Java 5에 추가되었습니다.

varargs 구문

변수(vararg)는 데이터 유형 뒤에 3개의 줄임표(3개의 점)로 구분되며, 일반적인 형태는 다음과 같습니다.

return_type method_name(data_type ... variableName){
}  

vararags의 필요성

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

메서드가 취할 수 있는 인수의 최대 수가 작고 알려진 경우 메서드의 오버로드 버전이 생성될 수 있습니다.메서드가 취할 수 있는 인수의 최대 수가 크거나 알 수 없는 경우, 접근법은 이러한 인수를 배열에 넣고 배열을 매개 변수로 사용하는 메서드에 전달하는 것입니다.이들 2가지 접근법은 오류가 발생하기 쉬웠습니다.매번 파라미터 배열을 구성하면 새로운 오버로드 메서드를 작성할 수 있기 때문에 유지보수가 어렵습니다.

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

메서드에 전달된 인수 수를 찾기 위해 여기서 길이가 사용되는 프로그램에서 확인할 수 있습니다.이는 vararargs가 암묵적으로 배열로 전달되기 때문에 가능합니다.varargs로 전달되는 인수는 varargs에 지정된 이름으로 참조되는 배열에 저장됩니다.이 프로그램에서는 어레이 이름이 값입니다.또한 메서드는 처음에는 4개의 인수를 사용하여 호출되고 다음으로3개의 인수를 사용하여 호출되며 다음으로 0개의 인수를 사용하여 호출됩니다.이러한 콜은 모두 varargs를 사용하는 동일한 방법으로 처리됩니다.

vararargs에 의한 제한

메서드에 varargs 파라미터를 가진 다른 파라미터를 포함할 수 있지만 이 경우 vararargs 파라미터는 메서드에 의해 선언된 마지막 파라미터여야 합니다.

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

vararargs의 또 다른 제약사항은 varargs 파라미터가 1개만 있어야 한다는 것입니다.

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

varargs 메서드의 오버로드

vararargs 파라미터를 사용하는 메서드를 오버로드할 수 있습니다.Varargs 메서드는 다음과 같이 오버로드될 수 있습니다.

vararg 파라미터의 유형은 다를 수 있습니다.다른 파라미터를 추가함으로써.vararargs 방법 오버로드 예제

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 메서드가 오버로드되어 있는 동안 콜이 애매할 수 있습니다.예를 들어보자

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 같은 의 파라메타로서 - Exp - Es Exp - Es Exp - Es Exp - Es Exp - Es Exp - Es Exp - Edgada 가 있습니다.displayData(int ... values) ★★★★★★★★★★★★★★★★★」displayData(int a, int ... values)

이 2개의 오버로드 방식에는 항상 애매모호함이 있습니다.

이는 Java에서 varargs(변수 인수)를 전달하는 방법입니다.

잘 , 은 C 대 、 C 、 C 、 C 와 the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the ....을 「」라고 사용했습니다.printf★★★★

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

타입에 , 타, 타, 타, 타, 타, 타, 타, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, 샘, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, String를 참조해 주세요.

다음은 vararargs를 사용하는 방법의 간단한 예입니다.

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 파라미터는 1로 제한되며 여러 var-art param을 가질 수 없다는 점을 알아두는 것이 중요합니다.예를 들어 다음과 같습니다.

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

키워드로 생각해 주세요.paramsC#의 경우, 그 배경에서 온 경우:)

3개의 점의 명확한 사용 예를 안드로이드 AsyncTask에서 가장 유명한 방법 중 하나(Google Architecture 컴포넌트는 말할 것도 없고 RXJAVA 때문에 많이 사용되지 않음)로 볼 수 있는 매우 일반적인 방법은 이 용어를 검색하기 위해 수천 개의 예를 찾을 수 있으며, 이 용어를 이해하고 사용하지 않는 가장 좋은 방법을 찾을 수 있습니다.그 세 개의 점의 의미는 그들이 ...을 표현한다는 것이다.공통어처럼요.즉, 전달해야 하는 파라미터의 수는 명확하지 않으며, 0일 수도 있고, 1일 수도 있고, 더 많을 수도 있습니다(배열).

다른 잘 작성된 답변에 더해 다음과 같은 장점이 있습니다.varagrs파라미터 타입으로서 어레이를 가지는 메서드를 호출하면, 어레이를 작성하는 번거로움이 없어져 요소를 추가한 후 송신할 수 있는 것이 도움이 됩니다.대신 0에서 많은 값으로 메서드를 호출할 수 있습니다.

구문: (트리플 도트...) --> 인수 내에서 0개 이상의 개체를 추가하거나 유형 개체의 배열을 전달할 수 있습니다.

public static void main(String[] args){}
public static void main(String... args){}

정의: 1) Object ... 인수는 객체 배열에 대한 참조일 뿐입니다.

2) ('String []' 또는 String ...') 임의의 수의 문자열 오브젝트를 처리할 수 있습니다.내부적으로 참조 유형 개체의 배열을 사용합니다.

i.e. Suppose we pass an Object array to the ... argument - will the resultant argument value be a two-dimensional array - because an Object[] is itself an Object:

3) 단일 인수를 사용하여 메서드를 호출하고 어레이일 경우 명시적으로 메서드를 랩해야 합니다.

another. method(new Object[]{array}); 
OR 
method((Object)array), which will auto-wrap.

응용 프로그램:주로 인수의 수가 동적(실행 시 인식되는 인수의 수)이고 오버라이드일 때 사용됩니다.일반 규칙 - 이 메서드에서는 모든 유형과 인수를 전달할 수 있습니다.특정 인수 앞에 객체(...) 인수를 추가할 수 없습니다.

void m1(String ..., String s) this is a wrong approach give syntax error.
void m1(String s, String ...); This is a right approach. Must always give last order prefernces.   

언급URL : https://stackoverflow.com/questions/3158730/what-do-3-dots-next-to-a-parameter-type-mean-in-java

반응형