item 2 sungjaeyoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ.

์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ์ ์ ˆํžˆ ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ์˜ 2๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž.

๊ธฐ์กด ํŒจํ„ด

1.์ ์ธต์  ์ƒ์„ฑ์ž ํŒจํ„ด - ํ•„์ˆ˜ ์ƒ์„ฑ์ž, ์„ ํƒ ๋งค๊ฐœ๋ณ€์ˆ˜ 1๊ฐœ๋ฅผ ๋ฐ›๋Š” ์ƒ์„ฑ์ž, ์„ ํƒ ๋งค๊ฐœ๋ณ€์ˆ˜ 2๊ฐœ๋ฅผ ๋ฐ›๋Š” ์ƒ์„ฑ์ž, ..., n๊ฐœ๋ฅผ ๋ฐ›๋Š” ์ƒ์„ฑ์ž
๋‹จ์ : ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์ฝ๊ธฐ๋„ ์–ด๋ ต๋‹ค.

2.์ž๋ฐ”๋นˆ์ฆˆ ํŒจํ„ด - ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ํ›„ ์„ธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹
๋‹จ์ : ๊ฐ์ฒด๊ฐ€ ์™„์„ฑ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ผ๊ด€์„ฑ์ด ๋ฌด๋„ˆ์ง„ ์ƒํƒœ์— ๋†“์ด๊ฒŒ ๋œ๋‹ค.


๋นŒ๋” ํŒจํ„ด

ํด๋ผ์ด์–ธํŠธ๋Š” ํ•„์ˆ˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด ๋นŒ๋” ๊ฐ์ฒด๋ฅผ ์–ป๊ณ  ๋นŒ๋” ๊ฐ์ฒด์˜ ์„ธํ„ฐ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์„ ํƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.

๊ฐ์ฒด ์„ ์–ธ

class NutritionFacts{
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;
    
    public static class Builder{
        //ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜
        private final int servingSize;
        private final int servings;
        
        //์„ ํƒ ๋งค๊ฐœ๋ณ€์ˆ˜ - ๊ธฐ๋ณธ๊ฐ’ ์ดˆ๊ธฐํ™”
        private int calories=0;
        private int fat=0;
        private int sodium=0;
        private int carbohydrate=0;
        
        public Builder(int servingSize, int servings){
            this.servingSize = servingSize;
            this.servings = servings;
        }
        
        public Builder calories(int val){calories = val; return this;}
        public Builder fat(int val){fat = val; return this;}
        public Builder sodium(int val){sodium = val; return this;}
        public Builder carbohydrate(int val){carbohydrate = val; return this;}

        public NutritionFacts build(){
            return new NutritionFacts(this);
        }
    }
    
    private NutritionFacts(Builder builder){
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ

NutritionFacts cocaCola = new NutritionFacts.Builder(240,8)
      .calories(100).sodium(20).carbohydrate(27).build();

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋นŒ๋”ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝ”๋“œ๋ฐ ์ฝ๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
๋นŒ๋” ํŒจํ„ด์— ์žฅ์ ๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด ์ด์ „์— ๋นŒ๋” ๊ฐ์ฒด๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.
๋นŒ๋” ๊ฐ์ฒด์˜ ์ƒ์„ฑ๋น„์šฉ์ด ํฌ์ง€๋Š” ์•Š์ง€๋งŒ ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•˜๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•ด์ ธ์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 4๊ฐœ์ด์ƒ์€ ๋˜์•ผ ๊ฐ’์–ด์น˜๋ฅผ ํ•œ๋‹ค.


์ •๋ฆฌ

์ƒ์„ฑ์ž๋‚˜ ์ •์ ํŒฉํ„ฐ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”ํŒจํ„ด์„ ์„ ํƒํ•˜๋Š”๊ฒŒ ๋‚ซ๋‹ค.