가변 인자 (Java Varargs)
📍 가변 인자 (Variable Arguments, VARARGS)
– 비정형 인자.
– 메서드 파라미터를 하나의 인자만 사용하여 다양하게 전달받는 기능.
– 동일한 타입의 파라미터를 0개 ~ 무한대로 전달받아 배열로 관리.
→ 전달받는 인자(데이터)의 개수에 따라 자동으로 배열 생성됨.
– 주의! 다른 파라미터와 가변 인자를 조합 가능하나 마지막 파라미터로 단 한 번만 지정 가능하며, 2개 이상 올 수 없음.
▸ 기본 문법
public void add (int... nums) { }
– 메서드 파라미터(매개변수) 선언 시, 데이터 타입 뒤에 ... 기호를 표기.
ex ) 가변 인자를 사용한 메서드 대표적인 예 : print() 메서드
System.out.println (String str, Object...objs) { }
EX )
• '가변 인자 사용하지 않은' 메서드 오버로딩
— NormalArguments 클래스 정의
class NormalArguments {
// 방법1
// print() 메서드 오버로딩
public void print(String name1) {
System.out.println(name1);
}
public void print(String name1, String name2) {
System.out.println(name1 + ", " + name2);
}
public void print(String name1, String name2, String name3) {
System.out.println(name1 + ", " + name2 + ", " + name3);
}
// 방법2
// 배열을 매개변수로 하는 메서드 만들기
public void print(String[] names) {
for(int i=0; i<names.length; i++) {
System.out.print(names[i] + " ");
}
System.out.println();
}
}
– 방법1 ) print() 메서드를 오버로딩하여 String타입의 변수 name을 통해 이름을 1개~3개 전달받아 출력하게끔 정의.
– 방법2 ) 배열을 매개변수로 하는 메서드 만들기.
— print 메서드 호출
// 방법1
NormalArguments na = new NormalArguments();
na.print("홍길동");
na.print("홍길동", "이순신");
na.print("홍길동", "이순신", "강감찬");
// 방법2
String[] strArr = {"홍길동", "이순신", "강감찬", "김영웅"};
na.print(strArr);
– 방법1, 인스턴스를 생성하고 각 파라미터에 데이터를 입력하여 출력함.
– 방법2, 배열을 파라미터로 사용하는 경우, 데이터 개수에 제한은 없지만 배열을 미리 생성하고 메서드 호출해야 함.
✓ 실행 결과
홍길동
홍길동, 이순신
홍길동, 이순신, 강감찬
홍길동 이순신 강감찬 김영웅
• '가변 인자 사용한' 메서드 오버로딩
— VariableArguments 클래스 정의
class VariableArguments{
public void print(String... names) { // names는 생략 가능
// 배열 내의 모든 데이터 출력
for(int i=0; i<names.length; i++) {
System.out.print(names[i] + " ");
}
System.out.println();
}
– 메서드 정의 시 파라미터로 사용할 변수 데이터타입 뒤에 ... 기호를 붙임.
– String타입 데이터를 0 ~ 무한대로 전달받을 수 있으며, 전달된 데이터는 자동으로 배열 생성 후 저장됨.
→ 가변인자를 사용한 변수 names는 String[ ] 타입으로 사용됨.
따라서 배열 접근 방법을 활용하여 배열 내의 모든 요소에 접근.
– for문을 사용하여 배열 내의 모든 데이터 출력함.
– 다른 파라미터와 가변 인자 조합 가능.
public void print2 (int num, String... names) {
// int형 데이터 1개와 문자열 데이터 여러개를 전달 가능
print2(10, "홍길동", "이순신");
// public void print3 (String... names, int num) {}
// 에러 발생!
// public void print4 (int... nums, String... names) {}
// 에러 발생!
}
}
– 가변 인자는 다른 파라미터보다 앞에 올 수 없음. 마지막 파라미터로 지정해야 하며 2개 이상 올 수 없음.
— print 메서드 호출
// 인스턴스 생성
VariableArguments va = new VariableArguments();
// 메서드 호출
va.print("홍길동");
va.print("홍길동", "이순신");
va.print("홍길동", "이순신", "강감찬");
va.print();
// 0개도 호출 가능
– VariableArguments 객체의 print() 메서드를 호출하면, 파라미터로 0개 ~ 무한대의 문자열 데이터 전달이 가능함.
✓ 실행 결과
홍길동
홍길동 이순신
홍길동 이순신 강감찬
Q ) 정수를 0개~무한대로 전달받아 출력하는 print() 메서드를 가지는 VariableArguments 클래스 정의.
단, 정수를 0개 전달할 경우 "전달받은 정수 없음!" 을 출력하고
1개 이상을 전달할 경우 전달받은 정수를 출력하기.
• 클래스 정의하기
class VariableArguments {
public void print(int... nums) {
if(nums.length == 0) {
System.out.println("전달받은 정수 없음!");
}else {
for(int i=0; i<nums.length; i++) {
System.out.print(nums[i] + " ");
}
System.out.println();
}
}
}
– 가변인자를 사용한 변수 nums는 int[ ]타입, 즉 배열로 데이터들이 저장됨.
– 배열의 길이가 0이라면, 즉 전달받은 데이터가 하나도 없다면 '전달받은 정수 없음!' 을 출력함.
– 전달받은 데이터가 있다면, 배열로 데이터들이 저장되었으므로 for문을 활용하여 배열 내의 모든 요소에 접근함.
• 메서드 호출하기
VariableArguments va = new VariableArguments();
vat.print(5, 8);
vat.print(1, 3, 5, 8, 2, 10);
vat.print();
– 메서드 파라미터에 가변인자를 사용하면 0개~무한대로 데이터를 받을 수 있음. 즉, 0개도 가능.
✓ 실행 결과
5 8
1 3 5 8 2 10
전달받은 정수 없음!