JDK1.5 이전에는 메서드의 매개변수 개수가 고정적이었습니다. 하지만 JDK 1.5 이후부터는 매개변수 개수를 동적으로 지정할 수 있게 되었고 이 기능은 '가변인자'를 통해 가능합니다.
이번 포스팅을 통해 가변인자를 이용한 메서드에 대해서 알아보겠습니다.
가변인자 사용법
가변인자는 메서드의 매개변수로 <타입...변수명>으로 선언하면 됩니다.
즉 예시로 보면, Java에서 제공하는 printf 함수는 아래와 같이 매개변수로 가변인자를 사용하고 있습니다.
public PrintStream printf(String format, Object ... args) {
return format(format, args);
}
가변인자 정의 시 주의할 점
매개변수로 가변인자를 사용하고자 한다면, 매개변수 중에서 제일 마지막에 선언을 해야 합니다. 즉 아래와 같이 선언하면 컴파일 에러가 발생합니다.
// 컴파일 에러 !!
public PrintStream printf(Object ... args, String format) {
return format(format, args);
}
가변인자의 장점
가변인자를 사용하면 어떤 점이 좋을까요?
가변인자가 없다면 같은 동작을 하는 메서드이지만 매개변수의 개수에 따라 하나씩 별도로 메서드를 생성해 주어야 합니다. 하지만 가변인자를 사용하면 하나의 메서드만 작성할 수 있다는 점에서 강력합니다.
void print() {
System.out.println();
}
void print(int a) {
System.out.println(a);
}
void print(int a, int b) {
System.out.println(a + b);
}
void print(int a, int b, int c) {
System.out.println(a + b + c);
}
void print(int[] a) {
int result = 0;
for (int a : args) {
result += a;
}
System.out.println(result);
}
// 위의 모든 메서드를 아래의 하나의 메서드로 통합 가능 (매개변수 개수가 0개인 것도 아래 메서드로 호출할 수 있다.)
void print(int... args) {
int result = 0;
for (int a : args) {
result += a;
}
System.out.println(result);
}
가변인자를 사용한 메서드와 배열을 인자로 사용한 메서드의 차이에서도 가변인자의 장점을 확인할 수 있습니다.
아래처럼 배열을 인자로 하는 메서드의 경우, 메서드 호출시 무조건 int형 배열 혹은 참조형 변수의 기본값이 null을 매개변수로 넘겨주어야 합니다.
void print(int[] a) {
if (a==null) return;
int result = 0;
for (int a : args) {
result += a;
}
System.out.println(result);
}
print(arr);
print(null);
//print(); 불가
하지만, 가변인자를 사용하면 길이가 0인 배열을 인자(인자 생략)로 지정할 수 있습니다.
void print(int... args) {
int result = 0;
for (int a : args) {
result += a;
}
System.out.println(result);
}
print(); // 인자 생략
가변인자의 단점
하지만, 가변인자는 내부적으로 배열을 이용하여 데이터를 조작합니다. 따라서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성되게 되므로 메모리 측면에서 비효율이 발생할 수 있습니다. 꼭 필요한 경우에만 가변인자를 사용하는 것이 좋습니다.
또한, 아래와 같이 가변인자를 선언한 메서드를 오버로딩할 경우에 메서드가 구별되지 않아서 컴파일 에러가 발생할 수 있습니다.
// 컴파일 에러!!
void print(int a, int...b) {
System.out.println(a);
}
void print(int... args) {
int result = 0;
for (int a : args) {
result += a;
}
System.out.println(result);
}
따라서, 가능하면 가변인자를 사용한 메서드는 오버로딩을 하지 않는 것이 좋아보입니다.
'Java' 카테고리의 다른 글
다형성(Polymorphism) (2) | 2023.10.15 |
---|---|
추상클래스(Abstract)과 인터페이스(Interface) (0) | 2023.10.15 |
제어자 (static과 final) (0) | 2023.10.15 |
JVM의 메모리 구조 (0) | 2023.10.14 |
자바의 변수 (종류 및 초기화) (0) | 2023.10.14 |