JavaRush /Java Blog /Random-KO /Java 가변 인수

Java 가변 인수

Random-KO 그룹에 게시되었습니다
오늘 우리는 Java의 varargs와 같은 것에 대해 논의할 것입니다. Varargs(또는 Variable Arguments)는 임의 개수의 인수를 사용하여 메서드를 생성할 수 있는 기술입니다. 이 기사에서는 이러한 메서드를 만드는 방법을 배우고, varargs가 필요한 이유와 이를 사용하는 것이 가장 좋은 경우에 대해 논의합니다.

가변 인수란 무엇입니까?

Varargs는 JDK5에 등장한 기능인 가변 길이 인수입니다. Varargs를 사용하면 임의 개수의 인수를 사용하여 메서드를 만들 수 있습니다. 대체로 이전에는 이러한 방법을 만드는 것이 가능했습니다. 사실, 이렇게 하는 것이 그리 편리하지는 않았습니다. 예를 들어 보겠습니다. 임의 개수의 정수 인수를 가져와 함께 추가하는 메서드를 작성해야 한다고 가정해 보겠습니다. Java 가변 인수 - 1우리에게는 두 가지 옵션이 있습니다. 옵션 1 - 과부하:
class Calculator {
    int sum(int a, int b){...};
    int sum(int a, int b, int c){...};
    int sum(int a, int b, int c, int d){...};
    int sum(int a, int b, int c, int d, int e){...};
}
하지만 과부하에는 두 가지 문제가 있습니다. 첫째, 멈춰야 할 시점이 언제인지 항상 명확하지 않고, 둘째로 번거롭다. 배열이 더 좋습니다. 옵션 2 - 어레이:
class Calculator {
    int sum(int[] numbers){...};
}
배열을 사용하면 더 이상 번거롭지 않으며 메소드를 호출할 때까지는 배열이 아무것도 아닌 것처럼 보입니다.
public static void main(String... sss) {
    Calculator calculator = new Calculator();

    int[] arguments = new int[7];
    arguments[0] = 1;
    arguments[1] = 10;
    arguments[2] = 123;
    arguments[3] = 234;
    arguments[4] = 6234;
    arguments[5] = 12;
    arguments[6] = 8;

    int sum = calculator.sum(arguments);
}
물론 모든 것을 더 간략하게 기록할 수 있다는 데 동의합니다. 하지만 첫째로, 배열을 가변 길이 인수로 사용할 때의 불편함을 보여주고 싶습니다. 둘째, 다음과 같이 작성하더라도:
int[] arguments = {1,10,123,234,6234,12,8};
int sum = calculator.sum(arguments);
그러면 우리는 여전히 과도한 양의 코드를 제거하지 못할 것입니다. 그러나 Java 5가 출시되면서 이러한 문제를 해결하는 Varargs 기능이 등장했습니다. 메소드에 임의 개수의 인수를 전달할 수 있게 되었습니다. 다음과 같이 보입니다.
public class Calculator {
    public static void main(String... sss) {
        Calculator calculator = new Calculator();
        int sum = calculator.sum(1,10,123,234,6234,12,8);
    }
    int sum(int... numbers){
       return Arrays.stream(numbers).sum();
    }
}
그럼 요약해 보겠습니다. Varargs는 Java 5 릴리스에 등장한 기능인 가변 길이 인수입니다. 다음으로 Varargs 작업에 대한 몇 가지 규칙을 자세히 살펴보겠습니다.

가변 인수의 5가지 규칙

규칙 1. Vararg 인수(또는 가변/임의 길이 인수)는 다음과 같이 줄임표로 표시됩니다.
String... words
Integer... numbers
Person... people
Cat... cats
규칙 2. 임의 길이의 인수는 일부 메소드에 대한 인수로만 지정할 수 있습니다.
void print(String... words)
int sum(Integer... numbers)
void save(Person... people)
void feed(Cat... cats)
규칙 3. 메소드 본문에 있는 각각의 가변 길이 인수는 배열입니다.
void print(String... words){
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }
}
규칙 4. Vararg 인수는 메소드 인수 목록의 마지막 인수여야 합니다.
void print(String... words, String anotherWord) // - Так нельзя!
void print(String... words, int someNumber) // - Так нельзя!

void print(String anotherWord, String... words) // - Так можно
void print(int someNumber, String... words) // - Так можно
규칙 5: varargs가 배열이더라도 가변 길이 인수를 취하는 메서드를 호출할 때 배열을 만들 필요는 없습니다. 필수 인수를 쉼표로 구분하여 간단히 나열하는 것만으로도 충분하며 바람직합니다.
public class Main {
    public static void main(String... sss) {
        print("How","же","прекрасно","изучать","Java");
    }

    static void print(String... words){
        for (int i = 0; i < words.length; i++) {
            System.out.println(words[i]);
        }
    }
}

가변 인수의 예

아래 예에서는 정수로 구성된 가변 인수를 가져와 전달된 요소 수와 그 합계를 표시하는 메서드를 작성합니다. 이 메서드에 배열과 일련의 정수를 모두 전달해 보겠습니다(두 옵션 모두 유효함).
public static void main(String... sss) {
    int[] a = new int[100];
    for (int i = 0; i < a.length; i++) {
        a[i] = i;
    }

    sum(a);
    sum(1,2,3,4,5,6,7,8,9,10);
}

static void sum(int... numbers){
    final int length = numbers.length;
    final int sum = Arrays.stream(numbers).sum();
    final String lineSeparator = System.lineSeparator();

    System.out.printf("Кол-во элементов для сложения - %d, сумма - %d%s", length, sum, lineSeparator);
}
프로그램을 실행하면 다음이 출력됩니다.

Кол-во элементов для сложения - 100, сумма - 4950 
Кол-во элементов для сложения - 10, сумма - 55 
이 메서드는 가변인수(varargs)도 허용한다는 점을 언급할 가치가 있습니다 System.out.printf. 이 메소드의 코드를 보면 다음과 같습니다.
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
varags를 허용하는 또 다른 널리 사용되는 방법은 String.format. 해당 코드는 다음과 같습니다.
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

언제 varargs를 사용하나요?

이 질문에 대한 대답은 묻는 사람에 따라 다릅니다. varargs가 포함된 메서드가 있는 일부 API의 클라이언트가 유사한 질문을 하면 "이러한 메서드를 가능한 한 자주 사용하십시오"라고 대답합니다. 코드 클라이언트의 경우 varargs는 코드를 더 쉽게 작성하고 더 읽기 쉽게 만들어 삶을 훨씬 더 쉽게 만듭니다. 그러나 varargs를 사용하여 메서드를 얼마나 자주 생성해야 하는지 궁금해하는 API 개발자가 이 질문을 하면 "varargs를 자주 사용하면 안 됩니다."라고 대답할 것입니다. Varargs는 사용의 이점이 분명한 경우에만 사용해야 합니다. 또한 varargs를 사용하여 메서드를 오버로드하는 것을 피해야 합니다. 이렇게 하면 코드 클라이언트가 오버로드된 메서드 중 실제로 호출되는 메서드를 이해하기 어려워지기 때문입니다.

결론

그래서 우리는 Java의 varargs라는 또 다른 주제를 다루었습니다. 우리는 그것이 무엇인지 알아냈습니다. varargs 사용 규칙을 설명했습니다. 임의의 길이 인수를 사용하는 메서드의 예를 살펴보고 가변 인수를 사용하는 것이 더 좋은 경우와 사용을 자제하는 것이 더 좋은 경우도 논의했습니다. 숙제로 다음 방법을 구현할 수 있습니다.
  • void일련의 정수를 가져와서 산술 평균을 반환하는 메서드를 작성하세요 .
  • void일련의 문자열을 가져와서 가장 긴 단어를 인쇄하는 메서드를 작성하세요 .
  • boolean유형의 변수를 첫 번째 인수로 반환하고 String일련 boolean의 변수 길이를 다음 인수로 반환하고 가져오는 메서드를 작성합니다 .
    가능한 값 은 , , String입니다 . 첫 번째 인수에 다른 값이 있는 경우 메서드는 예외를 발생시켜야 합니다 . 이 메서드는 varargs 인수의 각 요소에 대해 논리 연산(첫 번째 인수에 지정됨)을 수행하고 계산 결과를 반환해야 합니다.ANDORXORIllegalArgumentException
인수 및 결과 예시:
  • "AND", true, true, false - false를 반환합니다.
  • "OR", false, true, false, false - true를 반환합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION