가변형 인자란?
가변형 인자 = 비정형 인자(Variable Arguments, VARARGS)
- 메서드 파라미터를 하나의 인자만 사용하여 다양하게 전달받는 기능
- 동일한 타입의 파라미터를 0개~무한대로 전달받아 배열로 관리 => 전달받는 인자(데이터)의 개수에 따라 자동으로 배열 생성됨
- 메서드 파라미터(매개변수) 선언 시 데이터 타입 뒤에 ... 기호 표시 ex) public void add(int...nums) {}
- 가변 인자를 사용한 메서드 대표적인 예 : print() 메서드 => System.out.println(String str, Objdct...objs)
- 다른 파라미터와 가변 인자를 조합 가능
- 주의! 가변 인자는 마지막 파라미터로 한번만 지정 가능
가변 인자를 사용하지 않은 메서드 오버로딩
class NormalArguments {
// 가변 인자를 사용하지 않은 메서드 오버로딩
// print() 메서드 오버로딩
// String 타입 변수(name)를 통해 이름을 1개~3개 전달받아 출력
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);
}
// 파라미터로 String 타입 배열을 선언하는 경우
public void print(String[] names) {
// for문을 사용하여 배열 내의 모든 데이터 출력
for(int i=0;i<names.length; i++) {
System.out.print(names[i] + " ");
}
System.out.println();
}
} //NormalArguments class 끝
// 가변인자를 사용하지 않은 오버로딩 메서드 호출
NormalArguments na = new NormalArguments();
na.print("땅콩"); //문자열 데이터 1개 넣을 수 있는 오버로딩된 print()
na.print("땅콩1","땅콩2"); //문자열 데이터 2개 넣을 수 있는 오버로딩된 print()
na.print("땅콩1","땅콩2","땅콩3"); //문자열 데이터 3개 넣을 수 있는 오버로딩된 print()
만약, na.print("땅콩1","땅콩2","땅콩3","땅콩4"); 한다면, 오류발생!
=> 4개의 파라미터를 전달받는 메서드는 존재하지 않기 때문!
오류 없애기!
배열을 인자값으로 받는 print() 메서드 오버로딩하기!
// 만약, 배열을 파라미터로 사용하는 경우
// 데이터 개수에 제한을 받지 않지만, 배열을 미리 생성해야한다!
String[] strArr = {"땅콩1","땅콩2","땅콩3","땅콩4"}; // 배열생성
na.print(strArr);
} //main() 끝
가변 인자를 사용한 메서드 오버로딩
몇개 올지 모르겠으면 … 을 사용
} //클래스 끝
class VariableArguments {
// 가변 인자를 사용한 메서드 오버로딩
// => 메서드 정의 시 파라미터로 사용할 변수 데이터 타입 뒤에 .. .기호 붙임
public void print(String...names) {
// String 타입 데이터를 0~무한대로 전달받을 수 있으며 전달된 데이터는 자동으로 배열생성 후 저장됨
// => 가변인자를 사용한 변수 names는 String[] 타입으로 사용됨
// 따라서, 배열 접근 방법을 활용하여 배열 내의 모든 요소에 접근
// for문을 사용하여 배열 내의 모든 데이터 출력
for(int i=0;i<names.length;i++) {
System.out.print(names[i] + " ");
}
System.out.println();
}
}// VariableArguments class 끝
VariableArguments va = new VariableArguments();
// VariableArguments 객체(인스턴스)의 print() 메서드를 호출하면
// 파라미터로 0개~무한개의 문자열 데이터 전달이 가능함
va.print("땅콩");
va.print("땅콩1","땅콩2");
va.print("땅콩1","땅콩2","땅콩3");
va.print(); // 0개도 전달됨
System.out.println("========================");
} //main() 끝
} // public void print(String...names) { 끝
// 다른 파라미터와 가변 인자 조합 가능
public void print2(int num, String...names) {
// int형 데이터 1개와 문자열 데이터 여러 개를 전달 가능
// ex) print2(2,"땅콩1","땅콩2");
System.out.println("입력받은 문자열 개수 : " + num + "개");
for(int i=0;i<names.length;i++) {
System.out.print(names[i] + " ");
}
System.out.println();
} // public void print2(int num, String...names) { 끝
}// VariableArguments class 끝
va.print2(2, "땅콩1","땅콩2") ;
} //main() 끝
주의! 가변 인자는 마지막 파라미터로 한번만 지정 가능
오류가 나는 경우
가변인자가 다른 파라미터보다 앞에 올 수 없다!
public void print3(String...names, int num) { //오류발생!
// => The variable argument type String of the method print3 must be the last parameter
// }
가변인자가 2개 이상 올 수 없다! - ...을 두번 적어도 오류
public void print4(int...nums, String...names) { //오류발생!
// // => The variable argument type String of the method print3 must be the last parameter
// }
예제
클래스명 : VariableArgumentsTest 정수를 0개~무한대로 전달받아 출력하는 print() 메서드 오버로딩 단, 정수를 0개 전달할 경우 "전달받은 정수 없음!" 출력하고 1개 이상을 전달할 경우 전달받은 정수를 출력
class VariableArgumentsTest{
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();
}
}
} // VariableArgumentsTest class 끝
public static void main(String[] args) {
// VariableArgumentsTest 인스턴스(vat) 생성
VariableArgumentsTest vat = new VariableArgumentsTest();
vat.print(10,20);
vat.print(1,2,3,4,5,6);
vat.print();
} // main() 끝
} //Test class 끝
'JAVA' 카테고리의 다른 글
[JAVA] package(패키지) (0) | 2023.09.13 |
---|---|
[JAVA] 레퍼런스 this, 생성자 this (0) | 2023.09.13 |
[JAVA] Pass_by value·reference -메서드 호출 시 값 전달 방식에 따른 차이 (0) | 2023.09.13 |
[JAVA] 2차원 배열 (0) | 2023.09.13 |
[JAVA] 배열을 활용하여 거스름돈을 동전으로 바꾸기 (0) | 2023.09.11 |