item 53 JungHyunLyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

κ°€λ³€μΈμˆ˜(varargs) λ©”μ„œλ“œ

λͺ…μ‹œν•œ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ˜ 인수λ₯Ό 0개 이상 받을 수 μžˆλŠ” λ©”μ„œλ“œ.

κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄, κ°€μž₯ λ¨Όμ € 인수의 κ°œμˆ˜μ™€ 길이가 같은 배열을 λ§Œλ“€κ³ 

μΈμˆ˜λ“€μ„ 이 배열에 μ €μž₯ν•œλ‹€. κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œ μ•ˆμ—μ„œ 이 배열을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

κ°€λ³€μΈμˆ˜ ν™œμš© 예

static int sum(int... args) {
    int sum = 0;
    for (int arg : args)
        sum += arg;
    return sum;
}
/*
 * μ‹€ν–‰ 예
 * sum() -> 0
 * sum(1,2,3) -> 6
 */

잘λͺ»λœ κ°€λ³€μΈμˆ˜ ν™œμš© 예 (μΈμˆ˜κ°€ 1개 이상이어야 ν•˜λŠ” κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œ)

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;
}

μœ„ λ©”μ„œλ“œλŠ” 4κ°€μ§€ 문제λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

  1. 인수λ₯Ό 0개만 λ„£μ–΄ ν˜ΈμΆœν•˜λ©΄ λŸ°νƒ€μž„μ— μ‹€νŒ¨ν•œλ‹€. (μ»΄νŒŒμΌνƒ€μž„μ—μ„œ 검증 λΆˆκ°€)
  2. μ½”λ“œκ°€ μ§€μ €λΆ„ν•˜λ‹€.
  3. args μœ νš¨μ„± 검사λ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν•΄μ•Ό ν•œλ‹€.
  4. min의 μ΄ˆκΉƒκ°’μ„ Integer.MAX_VALUE둜 μ„€μ •ν•˜μ§€ μ•Šκ³ λŠ” for-each문을 μ‚¬μš©ν•  수 μ—†λ‹€.

μ•„λž˜μ— κ°œμ„ λœ μ½”λ“œλ₯Ό 보자

μ˜¬λ°”λ₯Έ κ°€λ³€μΈμˆ˜ ν™œμš© 예 (μΈμˆ˜κ°€ 1개 이상이어야 ν•˜λŠ” κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œ)

static int min(int firstArg, int... remainingArgs) {
    int min = firstArg;
    for (int arg : remainingArgs)
        if (arg < min)
            min = arg;
    return min;
}

4κ°€μ§€ λ¬Έμ œκ°€ λͺ¨λ‘ 해결됐닀!

  1. λŸ°νƒ€μž„ μ‹€νŒ¨ 제거.
  2. μƒλŒ€μ μœΌλ‘œ μ½”λ“œ 깔끔.
  3. args μœ νš¨μ„± 검사가 제거.
  4. min값을 첫번째 λ§€κ°œλ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ κ°•μ œλ‘œ μ„€μ •ν•˜μ—¬ μžμ—°μŠ€λŸ½κ²Œ for-eachλ¬Έ ν™œμš© κ°€λŠ₯.

기타 κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œμ˜ ν™œμš© (printf)

  • public PrintStream printf(String format, Object ... args)
  • public PrintStream printf(Locale l, String format, Object ... args)

κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œ μ‚¬μš©μ˜ 주의점

κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œλŠ” 호좜될 λ•Œλ§ˆλ‹€ 배열을 μƒˆλ‘œ ν•˜λ‚˜ ν• λ‹Ήν•˜κ³  μ΄ˆκΈ°ν™”ν•¨.

λ•Œλ¬Έμ— μ„±λŠ₯에 μ΄μŠˆκ°€ 생길 수 μžˆλ‹€.

이λ₯Ό μ–΄λŠ 정도 보완해쀄 수 μžˆλŠ” νŒ¨ν„΄μ΄ μžˆλ‹€.

λ°”λ‘œ κ°€λ³€μΈμˆ˜λ‘œ μž…λ ₯λ˜λŠ” 경우λ₯Ό λΆ„λ₯˜ν•˜μ—¬, 높은 ν™•λ₯ μ˜ κ²½μš°μ—λŠ” 일반 λ©”μ†Œλ“œλ‘œ μ§€μ •ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

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

μ—¬λŠ μ„±λŠ₯ μ΅œμ ν™”μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 이 기법도 보톡 λ•ŒλŠ” 별 이득이 μ—†μ§€λ§Œ, νŠΉμˆ˜ν•œ 상황에선 빛을 λ°œν•  것!