반응형

Java 가변 인자(Varargs) 사용법 및 주의사항 정리
1. 가변 인자(Varargs)란?
자바 5부터 도입된 기능으로, 메서드 호출 시 인자의 개수를 가변적으로 전달할 수 있으며 타입... 변수명 형태로 선언하며, 내부적으로는 배열로 처리
2. 가변 인자 사용 예시
public class VarargsExample {
public static void main(String[] args) {
// 인자 개수에 상관없이 호출 가능
System.out.println("결과 1: " + sum(10, 20));
System.out.println("결과 2: " + sum(1, 2, 3, 4, 5));
System.out.println("결과 3: " + sum()); // 인자가 없어도 가능
}
public static int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}
}
3. 가변 인자 사용 시 주의사항 (중요!)
- 마지막 파라미터로 선언: 가변 인자는 메서드 파라미터 중 가장 마지막에 위치해야 합니다. 그렇지 않으면 어디까지가 가변 인자인지 구분할 수 없어 컴파일 에러가 발생합니다.
public void test(String a, int... b) (O)
public void test(int... b, String a) (X)
- 오버로딩 주의: 가변 인자를 사용한 메서드를 오버로딩할 경우, 컴파일러가 어떤 메서드를 호출해야 할지 모호해지는 상황(Ambiguous)이 발생할 수 있으니 가급적 피하는 것이 좋습니다.
public class VarargsOverloadingTrap {
// 메서드 A: String 가변 인자
public static void display(String... args) {
System.out.println("display(String...) 호출");
}
// 메서드 B: String 일반 인자 1개 + String 가변 인자
public static void display(String first, String... others) {
System.out.println("display(String, String...) 호출");
}
public static void main(String[] args) {
// [문제 발생] 아래 호출은 어떤 메서드를 실행해야 할까요?
display("Hello", "World");
}
}
컴파일 결과
- 위 코드를 컴파일하면 display("Hello", "World") 라인에서 다음과 같은 에러가 발생합니다.
- Error: reference to display is ambiguous both method display(String...) in VarargsOverloadingTrap and method display(String, String...) in VarargsOverloadingTrap match
오류 원인
- display("Hello", "World") 호출은 메서드 A (display(String...))에도 부합합니다. ("Hello"와 "World" 두 개의 String 인자)
- 동시에 메서드 B (display(String, String...))에도 부합합니다. (첫 번째 인자 "Hello"는 first에, 두 번째 인자 "World"는 others 가변 인자에)
컴파일러는 두 메서드가 모두 유효하다고 판단하여 어떤 것을 선택할지 결정할 수 없다. 이것이 가변 인자를 사용할 때 오버로딩을 피해야 하는 가장 큰 이유
결론
- 가변 인자를 사용하는 메서드는 가급적 오버로딩하지 않는 것이 모호성 에러를 예방하는 가장 안전한 방법입니다.
4.성능 고려사항
- 가변 인자 메서드가 호출될 때마다 내부적으로 새로운 배열이 생성되고 초기화된다. 성능에 민감한 루프 내부나 빈번하게 호출되는 메서드에서는 가변 인자 사용을 재고하거나, 성능 테스트를 거치는 것이 좋다
반응형
'프로젝트 > JAVA' 카테고리의 다른 글
| java Statement 자바에서 디비 조회 (0) | 2022.11.11 |
|---|---|
| java split작동 안할때 (0) | 2022.11.09 |
| JAVA split특정문자 자르기 (0) | 2022.10.25 |
| JAVA 1초당 1회 출력 (Timer) (0) | 2022.09.23 |
| java(자바)에서 alert띄우기 (0) | 2021.10.26 |