2월 06, 2024

[Java] 가변인자, 오버로딩, 키워드 "..." 사용법

 오늘은 JDK1.5 부터 사용할 수 있는 Java의 가변인자 (variable argument)라는 개념에 대하여 알아보자. 


1. Java의 가변인자란? 

매개변수의 개수를 동적으로 지정해줄 수 있는 기능이며, JDK 1.5이상부터 지원된다. 키워드 ... 를 사용한다. 

public class Main {
    //가변인자로 넘겨진 숫자들의 합계를 구하는 코드
public static int sum(int... numbers) {
int sum= 0;
for (int num : numbers) {
sum += num;
}
return sum;
}

public static void main(String[] args) {
// 원하는 만큼 인자를 다양하게 함
System.out.println(sum(1, 2, 3, 4, 5
, 6));
              System.out.println(sum(10, 30));
    }
}



위와 같이 코드를 작성하면 sum이라는 함수에 넘겨지는 파라미터의 개수와 관계없이 동일한 함수로 처리할 수 있다는 장점이 있다. 또한 배열을 사용하지 않고 원하는 만큼 인자를 추가하여 더 직관적인 코드를 작성할 수 있다는 장점도 있다. 


2. 가변인자와 다른 파라미터를 함께 쓰고 싶다면? 

가변인자 이외에도 다른 파라미터를 함께 메소드로 전달해주고 싶다면 가변인자를 반드시 마지막에 써야한다. 가변인자는 항상 매개변수 목록의 마지막에 위치해야 한다는 것을 유의해야 하지만 인자의 개수가 정해지지 않은 인자이기 때문에 어떻게 생각해보면 당연한 이야기이다. 

public class Main {
// 가변인자와 다른 인자를 함께 사용 예시 메소드
public static void printMessage(String name, String... messages) {
System.out.print(name);
for (String message : messages) {
System.out.print(message + " ");
}
}

public static void main(String[] args) {
// 다른 매개변수와 가변인자 함께 사용한 메소드 호출
printMessage("John", "Hi", "Hello");
printMessage("James", "This ", "is ", "a ", "message");
}
}


위와 같이 name이라는 일반 parameter와 messages라는 가변인자가 들어왔을 때는 messages라는 가변인자가 가장 마지막에 들어가야 한다. 


3. 가변인자의 필요성?

그러면 가변인자의 개념이 왜 만들어졌으며 왜 유용한지, java의 오버로딩의 개념과 함께 설명해보겠다. 


Java에서는 매개변수의 개수와 Type이 다르더라도 동일한 이름으로 메소드를 구현할 수 있고 이를 오버로딩 (Overloading)이라고 한다. Overloading을 위해서는 아래와 같이 두 가지 조건이 충족되어야 한다. 


- 메소드 이름이 동일

- 매개변수의 개수/타입이 달라야함 


그러면 만약에 위에서 예시로 들었던 sum 함수로 overloading을 구현해보자. 


int sum(int a, int b){...}

int sum(int a, int b, int c){...}

int sum(int a, int b, int c, int d){...}


이런식으로 한없이 많은 overloading된 함수들을 구현할 수 있을 것이다. 하지만 무한히 많은 인자를 계속 더할 수 있다는 sum 함수의 특성을 고려해보았을 때 모든 경우에 대비하여 함수를 만들 수는 없다. 


이럴 때 Java의 가변인자를 사용하면 아주 쉽게 이 문제를 해결할 수 있다. 


키워드 "..."를 적극 활용하여 코드를 단순화시켜보자.