본문 바로가기

Java

가변인자(varargs)

728x90

JDK1.5 이전에는 메서드의 매개변수 개수가 고정적이었습니다. 하지만 JDK 1.5 이후부터는 매개변수 개수를 동적으로 지정할 수 있게 되었고 이 기능은 '가변인자'를 통해 가능합니다.

 

이번 포스팅을 통해 가변인자를 이용한 메서드에 대해서 알아보겠습니다.


 

가변인자 사용법

가변인자는 메서드의 매개변수로 <타입...변수명>으로 선언하면 됩니다. 

즉 예시로 보면, Java에서 제공하는 printf 함수는 아래와 같이 매개변수로 가변인자를 사용하고 있습니다.


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

가변인자 정의 시 주의할 점

매개변수로 가변인자를 사용하고자 한다면, 매개변수 중에서 제일 마지막에 선언을 해야 합니다. 즉 아래와 같이 선언하면 컴파일 에러가 발생합니다.


    // 컴파일 에러 !!
    public PrintStream printf(Object ... args, String format) {
        return format(format, args);
    }

가변인자의 장점

가변인자를 사용하면 어떤 점이 좋을까요? 

 

가변인자가 없다면 같은 동작을 하는 메서드이지만 매개변수의 개수에 따라 하나씩 별도로 메서드를 생성해 주어야 합니다. 하지만 가변인자를 사용하면 하나의 메서드만 작성할 수 있다는 점에서 강력합니다.


   void print() {
        System.out.println();
    }
    void print(int a) {
        System.out.println(a);
    }

    void print(int a, int b) {
        System.out.println(a + b);
    }

    void print(int a, int b, int c) {
        System.out.println(a + b + c);
    }
    
    void print(int[] a) { 
        int result = 0;
        for (int a : args) {
            result += a;
        }

        System.out.println(result);
    }

  
  // 위의 모든 메서드를 아래의 하나의 메서드로 통합 가능 (매개변수 개수가 0개인 것도 아래 메서드로 호출할 수 있다.)
    void print(int... args) {
        int result = 0;
        for (int a : args) {
            result += a;
        }

        System.out.println(result);
    }

가변인자를 사용한 메서드와 배열을 인자로 사용한 메서드의 차이에서도 가변인자의 장점을 확인할 수 있습니다.

 

아래처럼 배열을 인자로 하는 메서드의 경우, 메서드 호출시 무조건 int형 배열 혹은 참조형 변수의 기본값이 null을 매개변수로 넘겨주어야 합니다. 


    void print(int[] a) { 
    	if (a==null) return;
        int result = 0;
        for (int a : args) {
            result += a;
        }

        System.out.println(result);
    }
    
    
    print(arr);
    print(null); 
    //print(); 불가

 

하지만, 가변인자를 사용하면 길이가 0인 배열을 인자(인자 생략)로 지정할 수 있습니다. 


   void print(int... args) {
        int result = 0;
        for (int a : args) {
            result += a;
        }

        System.out.println(result);
    }

  print(); // 인자 생략

 


가변인자의 단점

하지만, 가변인자는 내부적으로 배열을 이용하여 데이터를 조작합니다. 따라서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성되게 되므로 메모리 측면에서 비효율이 발생할 수 있습니다. 꼭 필요한 경우에만 가변인자를 사용하는 것이 좋습니다.

 

또한, 아래와 같이 가변인자를 선언한 메서드를 오버로딩할 경우에 메서드가 구별되지 않아서 컴파일 에러가 발생할 수 있습니다. 


  //  컴파일 에러!!
void print(int a, int...b) {
	System.out.println(a);
}

void print(int... args) {
	int result = 0;
	for (int a : args) {
		result += a;	
    }

	System.out.println(result);
}

 

따라서, 가능하면 가변인자를 사용한 메서드는 오버로딩을 하지 않는 것이 좋아보입니다.

728x90
반응형

'Java' 카테고리의 다른 글

다형성(Polymorphism)  (2) 2023.10.15
추상클래스(Abstract)과 인터페이스(Interface)  (0) 2023.10.15
제어자 (static과 final)  (0) 2023.10.15
JVM의 메모리 구조  (0) 2023.10.14
자바의 변수 (종류 및 초기화)  (0) 2023.10.14