JAVA/BASIC

자바(Java) 가변인자 - Main메소드 매개변수 String[] args를 가변인자로 받아보기

유혁스쿨 2023. 4. 12. 00:13
728x90
반응형

인프런의 김영한님의 Spring 강의를 듣던 도중 자바스크립트의 전개식(Spread)와 비슷하게 생긴 문법을 확인하였는데,

이것이 자바다 책이나 명품 JAVA Programming에는 수록되지 않아 한참을 구글링 한 끝에 해당 문법에 대해서 찾게되었다.

 

자바 1.5부터 지원하고 있는 가변인자(Varargs) 라는 문법인데 이는 하나의 함수에서 매개변수를 동적으로 받을수 있는 방법이다.

매개변수의 갯수가 3개 혹은 5개 심지어 아무것도 넘기지않고 호출할 경우에도 적용이되어 사용이 가능하다.

메소드 오버로딩에서는 String 타입의 매개변수를 1개를 넘기거나 2개를 넘길때처럼 매개변수의 갯수에 따라 동일한 이름의 메소드를 여러개 정의해두고 이를 호출하는 방식으로 사용을 하지만, 이것은 제한적이다.

동일한 타입의 매개변수의 갯수에 제한을 두지 않고 예를들어 들어오는 매개변수의 갯수를 미리 제한하지 않고 자유롭게 들어오도록 설정한 뒤 누적합을 구한다거나 할 때 사용할 수 있다.

 

[가변인자를 활용하여 누적합을 구하는 메소드 sum()]

public class Example {
    public static void main(String[] args) {
        int sumValue = sum(1,2,3,4);
        System.out.println(sumValue); // 결과 : 10
    }
    public static int sum(int... intArgs) {
        int sum = 0;
        for(int arg : intArgs) {
            sum += arg;
        }
        return sum;
    }
}

위 코드를 보면 for문을 통해 intArgs에서 하나씩 추출하여 int arg변수에 담는데, 이것은 배열에서 추출하여 기본타입변수에 반복하여 저장하는것과 같다.

따라서 내부적으로는 배열과 동일한 매커니즘으로 작동하게된다.

 

그렇다면 main메소드의 String[] args 매개변수를 대신할 수 있지 않을까 하는 의문점이 들었다.

아래와 같이 코드를 작성해보았다.

 

public class Example {
    public static void main(String... args) {
        System.out.println(Arrays.toString(args));
    }
}

main메소드의 arguments에 hi와 bye 값을 인자값으로 설정한다.

 

컴파일 오류나 런타임 오류 모두 발생하지 않고 배열의 형태로 정상적으로 출력된다.

 

가변인자가 사용되는 것을 설명하자면 사실 가변인자가 사용된 메서드를 선언하면 배열이 새로 생기면서 사용되는 것이다. 

그래서 단순히 보게 되면 차이는 없어 보인다.

다만 호출할 때,  기존 main메소드에서는 반드시 String[]를 전달해야 하는 반면에, 가변인자로 설정한다면 String을 0개부터 원하는 개수만큼 나열할 수 있다는 장점이 있다.

 

매개변수로 배열을 넘겨주는 경우에는 매개변수를 생략할 수 없기 때문에 배열의 크기가 0인 변수를 매개변수를 넣어주거나,  null 값을 넘겨주어야 한다.

하지만 가변인자를 사용하면 매개변수를 생략해야 하는 경우 생략이 가능하다. 

 

단순하지만 기본적인 차이가 존재하는데 그건 바로 ‘매개변수를 생략할 수 있는가’이다.

이 차이점으로 인해 가변인자가 사용되는 것 같다.

728x90
반응형