다음 방법에서 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
그런 다음 String
var를 배열로 사용할 수 있습니다 .
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 # 의 키워드로 생각하십시오. 🙂
