본문 바로가기
JAVA

[JAVA] 가변인자(varargs)와 오버로딩

by 민죠미 2023. 1. 3.
기존에는 메서드의 매개변수 개수가 고정적이었으나 JDK1.5부터 동적으로 지정해 줄 수 있게 되었으며, 이 기능을 '가변인자(variable arguments)' 라고 한다.

 

가변인자는 '타입... 변수명' 과 같은 형식으로 선언하며, PrintStream 클래스의 printf()가 대표적인 예이다.

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

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

가변인자는 내부적으로 배열을 이용한다

따라서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다. 가변인자가 편리하지만, 이런 비효율이 숨어있으므로 꼭 필요한 경우에만 가변인자를 사용하자.

가변인자 vs 매개변수에 배열 사용

String concatenate(String... str){...}

System.out.println(concatenate());	//인자가 없음
System.out.println(concatenate("a"));	//인자가 하나
System.out.println(concatenate("a", "b"));	//인자가 둘
System.out.println(concatenate(new String[]{"A", "B"}));	//배열 가능
String concatenate(String[] str){...}

String result = concatenate(new String[0]);	//인자로 배열을 지정
String result = concatenate(null);	//인자로 null을 지정
String result = concatenate();	//에러. 인자가 필요함

매개변수의 타입을 배열로 하면, 반드시 인자를 지정해줘야하기 때문에 위의 쿠드처럼 인자를 생략할 수 없다. null이나 길이가 0인 배열을 인자로 지정해줘야하는 불편함이 있다.

가변인자 메서드의 오버로딩

static String concatenate(String delim, String... args){...}
static String concatenate(String... args){...}

위와 같이 가변인자를 선언한 메서드를 오버로딩할 경우 메서드를 호출했을 때 구별되지 못하는 경우가 발생하기 쉽다. 가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.

 

 

댓글