본문 바로가기
Java/Java

가변 인자(Variable Argument)란?

by 박채니 2022. 3. 11.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


가변 인자 (Variable Argument)란?

- 타입이 동일한 매개인자를 개수 상관없이 처리할 수 있다.

- 해당 타입의 배열인듯 처리

 

//기본 구문
리턴 타입 메소드명 (자료형... 참조 변수명) {
	...
}

자료형 다음에 (...)이 있는 형태입니다.

 

public static void main(String[] args) {
	ArgumentStudy study = new ArgumentStudy();
	study.test3(10, 20);
	study.test3(10, 20, 30);
	study.test3(10, 20, 30, 40);
}

public void test3(int...nums) {
	for(int i = 0; i < nums.length; i++) {
		System.out.print(nums[i] + " ");
	}
	System.out.println();
}

@콘솔출력값
10 20 
10 20 30 
10 20 30 40

넘겨 받은 매개인자들을 test3의 매개변수로 받았고, 모두 배열 타입으로 저장되므로 for문을 통해 출력을 해보았습니다.

배열의 크기는 함수가 호출될 때 전달된 입력값의 개수로 정해지기 때문에 for문으로 구현 가능했습니다.

 

public void test3(int...nums) {
		System.out.println("매개변수 길이 : " + nums.length);
		
//		for(int i = 0; i < nums.length; i++) {
////			System.out.print(nums[i] + " ");
//		}
//		System.out.println();
	}
    
@콘솔출력값
매개변수 길이 : 2
매개변수 길이 : 3
매개변수 길이 : 4

입력 받은 개수만큼 배열의 길이가 정해지는 것을 위처럼 확인할 수 있습니다.

 

 

값 없음, null, 배열도 매개변수로 받아 처리 가능!!

public static void main(String[] args) {
	ArgumentStudy study = new ArgumentStudy();
//	study.test1(args);
//	study.test2(args);
//	study.test3(10, 20);
//	study.test3(10, 20, 30);
//	study.test3(10, 20, 30, 40);
	
	study.test3();
	study.test3(null);
	int[] arr = {1, 2, 3};
	study.test3(arr);
}
	
public void test3(int...nums) {
//	System.out.println("매개변수 길이 : " + nums.length);
		
	if(nums != null) {
		for(int i = 0; i < nums.length; i++) {
			System.out.print(nums[i] + " ");
		}
		System.out.println();
	}
}

@콘솔출력값

1 2 3

다만 null 값을 넘겨준 후 출력을 하려고 하면 당연히 NullPointException 에러가 발생되겠죠?

if문으로 null이 아니라면 출력 구문을 실행하라고 코드를 다시 짜주었습니다.

 

 

가변인자는 메소드의 매개변수 선언부에 마지막에 사용 가능!!

//오류 발생
//매개변수가 다양할 시, 반드시 가변인자는 맨 뒤에
public void test4(int...nums, String s) {
	...		
}

메소드의 매개변수가 하나 이상일 경우에, 가변인자는 반드시 맨 마지막에 선언 해줘야 합니다.

위 코드는 
The variable argument type int of the method test4 must be the last parameter 에러메세지가 발생됩니다.

//문제 없음
public void test4(Stirng s, int...nums) {
	...		
}

가변인자를 맨 마지막에 선언해주면 문제 없이 사용 가능합니다.

 

 

가변인자는 메소드 당 딱 한 번만 사용 가능!!

//오류 발생
//가변인자는 메소드 당 한번만 선언할 수 있음
public void test4(int...nums, double... dnums) {
	...
}

가변인자는 메소드 당 한 번만 선언할 수 있으므로, 위와 같이 처리하면 안됩니다.

public void test4(int...nums) {
	...
}

public void test5(double... dnums) {
	...		
}

int형, double형 둘 다 만들고 싶다면 메소드를 분리하여 사용해야 합니다.

 

 

printf도 가변인자 메소드였다...!

Object... args, 무슨 타입이든 개수 제한 없이 다 받아준다!!

LIST