본문 바로가기

JAVA

item 53) 가변인수는 신중히 사용하라

728x90

가변인수는 메서드의 인수 개수가 정해지지 않았을 때 아주 유용하게 사용 할수 있음

가변인수 메서드를 호출하면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네줌

 

단점 : 인수가 1개이상이여야할 경우 인수가 0개만 받을 수 있게 설계하는 것은 좋지 않음

- 런타임 에러 발생 가능, 이를 체크하기 위한 로직으로 코드가 지저분해짐

-  for- each 문 사용하기 힘들어짐

- 성능에 민감한 경우 문제 발생(호출마다 배열 생성)

 

해결책 : 매개변수를 2개 받도록 함

첫번째로 평범한 매개변수를 받고, 가변인수를 두번쨰로 받음

public class Varargs {
	
    static int min(int... args) {
        if (args.length == 0)
            throw new IllegalArgumentException("인수가 1개 이상 필요합니다.");
        int min = args[0];
        for (int i = 1; i < args.length; i++)
            if (args[i] < min)
                min = args[i];
        return min;
    } // v1
    
    
	static int min(int firstArg, int... remainingArgs) {
        int min = firstArg;
        for (int arg : remainingArgs)
            if (arg < min)
                min = arg;
        return min;
    } // v2

    public static void main(String[] args) {

        System.out.println(min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
        System.out.println(min());

    }
}

 


public void foo(){}

public void foo(int a1){}

public void foo(int a1, int a2){}

public void foo(int a1, int a2, int a3){}

//함수 호출의 95%는 3개이하의 인수 호출함 나머지 5%만을 가변인수 메서드로 처리
public void foo(int a1, int a2, int a3, int... rest){}



//EnumSet에서 이 패턴을 사용한 예제



public static <E extends Enum<E>> EnumSet<E> of(E e) {
      EnumSet<E> result = noneOf(e.getDeclaringClass());
      result.add(e);
      return result;
  }


  public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) {
      EnumSet<E> result = noneOf(e1.getDeclaringClass());
      result.add(e1);
      result.add(e2);
      return result;
  }

  public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) {
      EnumSet<E> result = noneOf(e1.getDeclaringClass());
      result.add(e1);
      result.add(e2);
      result.add(e3);
      return result;
  }
  
  public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4) {
      EnumSet<E> result = noneOf(e1.getDeclaringClass());
      result.add(e1);
      result.add(e2);
      result.add(e3);
      result.add(e4);
      return result;
  }
  
  public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4,
                                                  E e5)
  {
      EnumSet<E> result = noneOf(e1.getDeclaringClass());
      result.add(e1);
      result.add(e2);
      result.add(e3);
      result.add(e4);
      result.add(e5);
      return result;
  }
      
  @SafeVarargs
  public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
      EnumSet<E> result = noneOf(first.getDeclaringClass());
      result.add(first);
      for (E e : rest)
          result.add(e);
      return result;
  }

 

 

'JAVA' 카테고리의 다른 글

interrupt vs notify  (0) 2021.03.16
item 54) null이 아닌 빈 컬렉션이나 배열을 반환하라  (0) 2021.03.12
HashMap 의 capacity와 load factor  (0) 2020.12.27
ThreadLocal  (0) 2020.11.22
Java 멀티쓰레드 동기화 - (3) AtomicClass  (0) 2020.10.24