English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 예제를 통해 Java의 가변 파라미터(Varargs)를 배우게 됩니다. 또한, 언제 varargs를 사용하고 언제 사용하지 않는지도 배울 것입니다.
추가로Java 메서드. 하지만, 메서드가 얼마나 많은 파라미터를 받을지는 확실하지 않습니다. 이 문제를 해결하기 위해 Java는 1.5varargs가 도입되었습니다.
Varargs는 가변 파라미터의 약자입니다. Java에서 메서드의 파라미터는 불특정한 수의 값을 받을 수 있습니다. 불특정한 수의 값을 받을 수 있는 파라미터는 varargs라고 합니다.
varargs의 구문은 다음과 같습니다:
accessModifier methodName(datatype... arg) { // 메서드 본문 }
varargs를 정의하기 위해 메서드의 형식 파라미터에 (...)를 사용합니다.
가변 수량 파라미터를 받는 메서드는 가변 수량 메서드라고 불리거나, 간단히 varargs 메서드라고 합니다.
먼저, varargs를 사용하지 않는 예제를 보겠습니다:
class NoVararg { public int sumNumber(int a, int b){ return a+b; } public int sumNumber(int a, int b, int c){ return a+b;+c; } public static void main( String[] args ) { NoVararg obj = new NoVararg(); System.out.println(obj.sumNumber(1, 2)); System.out.println(obj.sumNumber(1, 2, 3)); } }
프로그램을 실행하면 다음과 같은 출력이 됩니다:
3 6
보여주듯이, sumNumber() 메서드를 재정의하여 다양한 파라미터를 받을 수 있어야 합니다.3개의 파라미터.
사용자가 추가하려는5개의 숫자나10또는100이 되면 어떻게 합니까?
varargs를 사용하면 이 문제를 간결하게 처리할 수 있습니다. 코드 예제를 보겠습니다:
class VarargExample { public int sumNumber(int ... args){ System.out.println("파라미터 길이: ") + args.length); int sum = 0; for(int x: args){ sum +=x; } return sum; } public static void main( String[] args ) { VarargExample ex = new VarargExample(); int sum2 =ex.sumNumber(2, 4); System.out.println("sum2 =" + sum2); int sum3 =ex.sumNumber(1, 3, 5); System.out.println("sum3 =" + sum3); int sum4 =ex.sumNumber(1, 3, 5, 7); System.out.println("sum4 =" + sum4); } }
프로그램을 실행하면 다음과 같은 출력이 됩니다:
매개변수 길이: 2 sum2 = 6 매개변수 길이: 3 sum3 = 9 매개변수 길이: 4 sum4 = 16
여기서 sumNumber() 메서드는 전달된 int 매개변수의 합을 반환합니다(전달된 매개변수의 수와 관계없이)。
如表所示,varargs는 특정 상황에서 매우 유용하지만,메서드에 전달할 매개변수의 수를 확정지을 경우 메서드 오버로드를 사용하는 것이 좋습니다. 예를 들어, sumNumber() 메서드가 단순히 계산에 사용될 것이라고 확정지을 경우:2또는3매개변수의 총 합을 구할 때, 첫 번째 예시와 같이 오버로드를 사용합니다.
다음 예시를 또 한 번 들어보겠습니다. Java 라이브러리에서 정의된 format() 메서드는 varargs를 받습니다. JDK에서 format() 메서드는 다음과 같이 정의됩니다:
public static String format(Locale l, String format, Object... args) { // body }
class Company { public static void main(String[] args) { String siteName = "oldtoolbag.com"; int empCount = 6; String type = "튜토리얼 웹사이트"; System.out.println( String.format( "Site Name : %s, Emp Count: %d Type: %s", siteName, empCount, type ) ); } }
프로그램을 실행하면 다음과 같은 출력이 됩니다:
Site Name : oldtoolbag.com, Emp Count: 6 Type: 튜토리얼 웹사이트
다음과 같은 가상 코드를 보겠습니다:
public int sumNumber(int ...nums) { // 메서드 본문 }
... 문법은 Java 컴파일러에게 이 메서드를 0개 이상의 매개변수로 호출할 수 있음을 알립니다. 결과적으로 nums 변수는 은밀히 int [] 타입으로 선언됩니다.배열따라서, 메서드 내에서 nums 변수에 접근하기 위해 배열 문법을 사용합니다.
매개변수가 없으면 nums의 길이는 0입니다.
표준 메서드와 유사하게, vararg 메서드를 오버로드할 수 있습니다.
class VarargOverload {}} private void test(int ... args){ int sum = 0; for (int i: args) { sum += i; } System.out.println("sum = ", + sum); } private void test(boolean p, String ... args){ boolean negate = !p; System.out.println("negate = ", + negate); System.out.println("args.length = ",+ args.length); } public static void main( String[] args ) { VarargOverload obj = new VarargOverload(); obj.test(1, 2, 3); obj.test(true, "hello", "world"); } }
프로그램을 실행하면 다음과 같은 출력이 됩니다:
sum = 6 negate = false args.length = 2
위의 프로그램에서 test() 메서드는 받을 수 있는 매개변수 수를 변경하여 오버로드됩니다。
Java Varargs를 사용할 때 기억해야 할 몇 가지 사항이 있습니다:
1메서드 서명을 정의할 때는 반드시보존마지막 varargs.
변수 매개변수는 메서드에 전달된 마지막 매개변수여야 합니다. 다음과 같은 doSomething() 메서드를 생각해보세요:
doSomething(1, 2, 3, 4);
또한, doSomething() 메서드는 다음과 같이 정의되어 있습니다:
//잘못된 메서드 선언 public void doSomething(int ... nums, int p){ // 메서드 본체 }
이 경우, 컴파일러는 nums에 전달된 매개변수 수를 결정할 수 없습니다。
하지만, 메서드를 다음과 같이 정의하면:
public void doSomething(int p, int ... nums) { // 메서드 본체 }
Java 컴파일러는 첫 번째 매개변수를 p에 할당하고 나머지 int 매개변수를 nums에 할당합니다。
2한 메서드는 하나의 varargs 매개변수만 가져올 수 있습니다。
예를 들어, 이 메서드 선언은 정확하지 않습니다:
int doSomething(int p, float ... floatNums, double ... doubleNums) { // code }
이렇게 오버로드된 test() 메서드를 확인해 보겠습니다:
class Demo { static void test(int ... vargs) { // 메서드 본체 } static void test(int n, int ... vargs) { // 메서드 본체 } }
위의 프로그램에서, test() 메서드를 호출하려고 시도할 때도, test() 메서드가 오버로드되어 다른 매개변수 수를 받을 때도 컴파일러는 혼란스럽습니다.
컴파일러는 호출하는 메서드를 알 수 없습니다. 컴파일러는 test(int ... vargs)를 varargs 매개변수를 사용하여 호출하려고 시도하고 있다고 생각할 수 있습니다. 마찬가지로, 컴파일러는 test(int n, int ... vargs)를 첫 번째 매개변수에 전달된 매개변수를 사용하여 호출하려고 시도하며 두 번째 매개변수는 공백으로 생각할 수 있습니다.
두 가지 가능성이 있기 때문에歧义이 발생합니다. 따라서, 때로는 varargs 메서드를 오버로드하는 대신 두 가지 다른 메서드 이름을 사용해야 할 수 있습니다.