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

Effective Java 3e μ•„μ΄ν…œ 53λ₯Ό μš”μ•½ν•œ λ‚΄μš© μž…λ‹ˆλ‹€.

κ°€λ³€μΈμˆ˜(vargs) λ©”μ„œλ“œλŠ” λͺ…μ‹œν•œ νƒ€μž…μ˜ 인수λ₯Ό 0개 이상 받을 수 μžˆλ‹€. κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄, κ°€μž₯ λ¨Όμ € 인수의 κ°œμˆ˜μ™€ 길이가 같은 배열을 λ§Œλ“€κ³  μΈμˆ˜λ“€μ„ 이 배열에 μ €μž₯ν•˜μ—¬ κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œμ— 건넀쀀닀.

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

이 λ°©μ‹μ—λŠ” λ¬Έμ œκ°€ λͺ‡ 개 μžˆλ‹€.

  • κ°€μž₯ μ‹¬κ°ν•œ λ¬Έμ œλŠ” 인수λ₯Ό 0개만 λ„£μ–΄ ν˜ΈμΆœν•˜λ©΄ (μ»΄νŒŒμΌνƒ€μž„μ΄ μ•„λ‹Œ) λŸ°νƒ€μž„μ— μ‹€νŒ¨ν•œλ‹€λŠ” 점이닀.
  • μ½”λ“œλ„ μ§€μ €λΆ„ν•˜λ‹€.

κ°œμ„ ν•΄λ³΄μž.

λ‹€μŒ μ½”λ“œμ²˜λŸΌ λ§€κ°œλ³€μˆ˜λ₯Ό 2개 받도둝 ν•˜λ©΄λœλ‹€. 즉, 첫 λ²ˆμ§Έλ‘œλŠ” 평범함 λ§€κ°œλ³€μˆ˜λ₯Ό λ°›κ³ , κ°€λ³€μΈμˆ˜λŠ” 두 번째둜 λ°›μœΌλ©΄ μ•žμ„œμ˜ λ¬Έμ œκ°€ λ§μ”€νžˆ 사라진닀.

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

μ„±λŠ₯에 λ―Όκ°ν•œ 상항이라면 κ°€λ³€μΈμˆ˜ μ‚¬μš©μ€ κ³ λ €ν•΄λ³΄μž

κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œλŠ” 호좜될 λ•Œλ§ˆλ‹€ 배열을 μƒˆλ‘œ ν•˜λ‚˜ ν• λ‹Ήν•˜κ³  μ΄ˆκΈ°ν™”ν•œλ‹€. κ°€λ³€μΈμˆ˜μ˜ μœ μ—°μ„±μ΄ ν•„μš”ν•  λ•Œ 선택할 수 μžˆλŠ” 멋진 νŒ¨ν„΄μ΄ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ ν•΄λ‹Ή λ©”μ„œλ“œ 호좜의 95%κ°€ 인수λ₯Ό 3개 μ΄ν•˜λ‘œ μ‚¬μš©ν•œλ‹€κ³  ν•΄λ³΄μž. κ·Έλ ‡λ‹€λ©΄ λ‹€μŒμ²˜λŸΌ μΈμˆ˜κ°€ 0개인 것뢀터 4개인 κ²ƒκΉŒμ§€, 총 5개λ₯Ό λ‹€μ€‘μ •μ˜ν•˜μž. λ§ˆμ§€λ§‰ λ‹€μ€‘μ •μ˜ λ©”μ„œλ“œκ°€ 인수 4개 이상인 5%의 ν˜ΈμΆœμ„ λ‹΄λ‹Ήν•˜λŠ” 것이닀.

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) { }

λ”°λΌμ„œ λ©”μ„œλ“œ 호좜 쀑 단 5%만이 배열을 μƒμ„±ν•œλ‹€.

EnumSet의 정적 νŒ©ν„°λ¦¬λ„ 이 기법을 μ‚¬μš©ν•΄ μ—΄κ±° νƒ€μž… 집합 생성 λΉ„μš©μ„ μ΅œμ†Œν™”ν•œλ‹€. EnumSet은 λΉ„νŠΈ ν•„λ“œ(μ•„μ΄ν…œ 36)λ₯Ό λŒ€μ²΄ν•˜λ©΄μ„œ μ„±λŠ₯κΉŒμ§€ μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ μ•„μ£Ό μ μ ˆν•˜κ²Œ ν™œμš©ν•œ 예라 ν•  수 μžˆλ‹€.

μ•„μ΄ν…œ 36 EnumSet μ˜ˆμ‹œ

import java.util.*;

// μ½”λ“œ 36-2 EnumSet - λΉ„νŠΈ ν•„λ“œλ₯Ό λŒ€μ²΄ν•˜λŠ” ν˜„λŒ€μ  기법 (224μͺ½)
public class Text {
    public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}

    // μ–΄λ–€ Set을 λ„˜κ²¨λ„ λ˜λ‚˜, EnumSet이 κ°€μž₯ μ’‹λ‹€.
    public void applyStyles(Set<Style> styles) {
        System.out.printf("Applying styles %s to text%n",
                Objects.requireNonNull(styles));
    }

    // μ‚¬μš© 예
    public static void main(String[] args) {
        Text text = new Text();
        text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
    }
}

정리

인수 κ°œμˆ˜κ°€ μΌμ •ν•˜μ§€ μ•Šμ€ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€λ©΄ κ°€λ³€μΈμˆ˜κ°€ λ°˜λ“œμ‹œ ν•„μš”ν•˜λ‹€. λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ ν•„μˆ˜ λ§€κ°œλ³€μˆ˜λŠ” κ°€λ³€μΈμˆ˜ μ•žμ— 두고, κ°€λ³€μΈμˆ˜λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” μ„±λŠ₯ λ¬Έμ œκΉŒμ§€ κ³ λ €ν•˜μž

⚠️ **GitHub.com Fallback** ⚠️