☕️자바 𝗝𝗔𝗩𝗔

[Java] 가변인자(varargs, 쩜쩜쩜) 사용법 (매개변수 동적 사용)

비타민찌 2022. 10. 25. 23:11
728x90

가변인자란, 하나의 함수에서 매개변수를 동적으로 받을수 있는 방법. 메서드의 매개변수 개수를 동적으로 지정해주는 방법이다.

'타입… 변수명' 형식으로 선언할 수 있고, 예시로 PrintStream Class의 printf()가 있다.

public PrintStream printf(String format, Object ...args) { ... }

 

가변인자와 비슷한 방법으로 오버로딩이 있지만, 오버로딩은 다음과같이 함수 정의를 여러개 해야하고

public class test {
	public static void main(String[] args) {
		test t = new test();
		t.variable("A");
		t.variable("A","B");
		t.variable("A","B","C");
	}
	
	public void variable(String s) {
		System.out.println(s);
	}
	
	public void variable(String s, String ss) {
		System.out.println(s);
		System.out.println(ss);
	}
    
    [ ... ]

미리 정의한 매개변수보다 많거나 적은 매개변수를 넘길 수 없다.

t.variable("A", "B", "c"); <- Error!

 

 

가변인자 문법

가변인자는 가변인자를 나타내는 기호 "..."  쩜쩜쩜을 사용한다. 변수 타입뒤에 붙여주고 변수명을 쓰면 된다.

public class test {
	public static void main(String[] args) {
		test t = new test();
		t.variable();
		t.variable("A");
		t.variable("A","B");
		t.variable("A","B","C");
	}
	
	public void variable(String... s) {
		System.out.println(Arrays.toString(s));
	}
}

 

가변인자는 전달인자를 0개부터 n개까지 넣을수 있다. 가변인자는 컴파일시 배열로 처리되기때문에 사용할때 위 코드처럼 Arrays.toString() 으로 빼줘야 한다. (0개나 1개도)

 

가변인자 문법 주의

1. 가변인자는 매개변수 중 제일 마지막에 사용해야 한다. 가변인자 외에도 매개변수가 더 있을 때, 가변인자가 앞에 있다면 가변인자가 아닌 매개변수와 구별을 할 수 있는 방법이 없기 때문에 이를 허용하지 않는다. 가변인자를 매개변수 앞에 선언하면 다음처럼 컴파일 에러가 발생한다.

java: varargs parameter must be the last parameter

 

2. 가변인자 메서드는 오버로딩 시 주의해야한다.

가변인자는 내부적으로 배열을 이용하기 때문에 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다. 가변인자를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 구별되지 못하는 경우 애매한 경우가 발생하기 쉽기 때문에 주의 해야한다. 

Error: java: reference to concatenate is ambiguous both method...

가능하다면 가변인자를 사용한 메서드는 오버로딩을 하지 않는 것이 바람직하다.

728x90