JAVA

가변 인자 (Java Varargs)

태로미 2023. 3. 12. 22:11

 

 

 

 

 

 

 

 

 

 

📍   가변 인자 (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 
전달받은 정수 없음!