코딩/JAVA

가변인자란? 가변인자와 오버로딩?_자바의정석

letsgoit39 2021. 7. 22. 00:50
728x90

가변인자(varargs)란?

메서드의 매개변수의 개수를 유동적으로 지정하는 형식? 

(1개가 될 수도 2개가 될 수도 그 이상이 될 수도 있다는 뜻_매개변수를 무제한으로 즐겨요!)

 

jdk1.5부터 메서드의 매개변수의 개수를 동적으로 지정해줄 수 있게 됨

//가변인자의 형식 : '타입...변수명'
//대표적 예 : PrintStream의 printf()메서드

printf()메서드는 받는 매개변수가 1개일 수도 2개일 수도 그 이상일 수도 있다.
사용자가 매개변수를 몇 개를 사용할지 알 수 없으나
유동적으로 콤마(,)와 함께 지정할 수 있게 함.

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

(여기서 'Object...args'로 가변인자 선언)

가변인자 외에도 매개변수가 있다면
가변인자를 매개변수 가장 마지막에 선언해야 한다(그렇지 않으면 컴파일 에러 발생)
가변인자인지 아닌지를 구별할 방법이 없으니 그런 것이다. 

가변인자는 내부적으로 배열을 이용한다.
그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 생성되므로
편리하지만 비효율적이다.

(잘 취사선택해서 사용하자)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class VarArgsEx {
    public static void main(String[] args) {
        //String 객체 배열
//        String[] stringArr = new String[]{ "100", "200", "300" };
        String[] strArr = { "100""200""300" };        //new String[] 생략
        
        System.out.println(concatenate("""100""200""300"));    //인자가 3개
        System.out.println(concatenate("-", strArr));
        System.out.println(concatenate("-"new String[] {"100""200""300"}));    //위문장과 같음(new String[] 생략 불가)
//        System.out.println(concatenate("-", {"100", "200", "300"}));                //syntax에러(new String[] 생략 불가)
        
        System.out.println(concatenate(","new String[]{"1""2""3"}));
        System.out.println("["+concatenate(",", strArr[0])+"]");
        System.out.println("["+concatenate(",")+"]");
    }
 
    //가변인자로 매개변수 선언한 메서드
    static String concatenate(String delim, String... args) {
        String result = "";
 
        for(String str : args) {
            result += str + delim;    //문자열에 구분자(delim)를 포함시켜 반환
        }
        return result;
    }
 
    //    아래 주석을 해제하고 실행하면 'The method concatenate(String, String[]) is ambiguous for the type VarArgsEx'라고 함.
/*
    static String concatenate(String... args) {
        return concatenate("",args);
    }
*/
// class
 
cs

concatenate메서드는 매개변수로 입력된 문자열에 구분자를 사이에 포함시켜

결합해서 반환해주는 역할을 한다.

가변인자로 매개변수를 선언해서

문자열을 개수의 제약없이 매개변수로 지정할 수 있다.

 

 

가변인자를 매개변수로 한 메서드의 오버로딩

그리고 주석처리 해제한 마지막 코드를 보면

가변인자를 사용한 메서드를 오버로딩하는 것이 종종 오류를 발생시킨다는 사실을 보여준다.

 

가변인자를 선언한 메서드를 오버로딩하면 컴파일러가 구별하지 못하는 경우가 쉽게 발생하기 때문에

되도록 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.

728x90