2023. 1. 6. 14:30ใJAVA/Effective JAVA
์์ดํ 2. ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ๋น๋๋ฅผ ๊ณ ๋ คํ๋ผ.
์ดํํฐ๋ธ ์๋ฐ์์๋ ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ์ ์ธต์ ์์ฑ์ ํจํด์ด๋ ์๋ฐ๋น์ฆ ํจํด๋ณด๋ค๋ ๋น๋ํจํด ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์๋ค.
์ด ๋น๋ํจํด์ ๊ณ์ธต์ ์ผ๋ก ์ค๊ณ๋ ํด๋์ค์ ํจ๊ป ์ฐ๊ธฐ์ ์ข๋ค.
์ถ์ ํด๋์ค๋ ์ถ์ ๋น๋๋ฅผ, ๊ตฌ์ฒด ํด๋์ค๋ ๊ตฌ์ฒด ๋น๋๋ฅผ ๊ฐ๋๋ค.
Pizza : ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฃจํธ์ ๋์ธ ์ถ์ ํด๋์ค
pizza๋ ์ถ์ ํด๋์ค๋ก Builder ๋ ์ญ์ ์ถ์ ๋น๋๋ฅผ ๊ฐ๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด Pizza.Builder ํด๋์ค๋ ์ฌ๊ท์ ํ์ ํ์ ์ ์ด์ฉํ๋ ์ ๋ค๋ฆญ ํ์ ์ด๋ค.
โ ์ฌ๊ท์ ํ์ ํ์
: ํ์ ๋งค๊ฐ๋ณ์๊ฐ ์์ ์ ํ์ ์ ํฌํจํ๋ ์์ ๋ชจ๋์ ํ์ ๋๋ ๊ฒ์ ๋งํ๋ค.
๊ทธ๋ฆฌ๊ณ self()๋ฅผ ์ถ๊ฐํด์ ํ์ ํด๋์ค์์ ํ๋ณํํ์ง ์๊ณ ๋ ๋ฉ์๋ ์ฐ์๋ฅผ ์ง์ํ ์ ์๋ค.
NyPizza : Pizza์ ํ์ ํด๋์ค
public class NyPizza extends Pizza
{
public enum Size {SMALL, MEDIUM, LARGE}
private final Size size;
public static class Builder extends Pizza.Builder<Builder>
{
private final Size size;
public Builder(Size size)
{
this.size = Objects.requireNonNull(size);
}
@Override
public NyPizza build()
{
return new NyPizza(this);
}
@Override
protected Builder self()
{
return this;
}
}
NyPizza(Builder builder)
{
super(builder);
size = builder.size;
}
@Override
public String toString()
{
return toppings + "๋ก ํ ํํ ํผ์";
}
}
-> ๋ด์ ํผ์๋ ํฌ๊ธฐ ๋งค๊ฐ๋ณ์๋ฅผ ํ์๋ก ๋ฐ๋๋ค.
Calzone : Pizza์ ํ์ ํด๋์ค
public class Calzone extends Pizza
{
private final boolean sauceInside;
public static class Builder extends Pizza.Builder<Builder>
{
private boolean sauceInside;
public Builder sauceInside()
{
sauceInside = true;
return this;
}
@Override
public Calzone build()
{
return new Calzone(this);
}
@Override
protected Builder self()
{
return this;
}
}
private Calzone(Builder builder)
{
super(builder);
sauceInside = builder.sauceInside;
}
@Override
public String toString()
{
return String.format("%s๋ก ํ ํํ ์นผ์ด๋ค ํผ์ (์์ค๋ %s์)" , toppings,
sauceInside ? "์" : "๋น๊นฅ");
}
}
-> ์นผ์ด๋ค ํผ์๋ ์์ค๋ฅผ ์์ ๋ฃ์์ง ์ ํํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ํ์๋ก ๋ฐ๋๋ค.
๊ฐ ํ์ ํด๋์ค์ธ NyPizza์ Calzone ๊ฐ ๊ตฌํํ build() ๋ฉ์๋๋ฅผ ๋ณด๋ฉด ํด๋นํ๋ ๊ตฌ์ฒด ํ์ ํด๋์ค๋ฅผ ๋ฐํํ๋๋ก ์ ์ธํ๋ค.
NyPizza.Builder๋ NyPizza๋ฅผ Calzone.Builder๋ Calzone๋ฅผ ๋ฐํํ๋ค.
-> ์ด๋ ๊ฒ ํ์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์์ ํด๋์ค๊ฐ ์ ์ํ ๋ฐํ ํ์ ์ด ์๋, ๊ทธ ํ์ ํ์ ์ ๋ฐํํ๋ ๊ธฐ๋ฅ์ ๊ณต๋ณ ๋ฐํ ํ์ดํ์ด๋ผ๊ณ ํ๋ค.
๊ณต๋ณ ๋ฐํ ํ์ดํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ์์ ํ ๋ณํ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์ฌ์ฉํ ์ ์๋ค.
๋น๋ ํจํด์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์ํํ๋ฉด์ ๋ง๋ค ์๋ ์๊ณ , ๋น๋์ ๋๊ธฐ๋ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์๋ ์๋ค.
๋น๋ ํจํด์ ์ฅ์ ๋ ์์ง๋ง, ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด์ ๋น๋๋ถํฐ ๋ง๋ค์ด ์ค์ผ ํ๋๋ฐ ์ ์ธต์ ์์ฑ์ ํจํด๋ณด๋ค๋ ์ฝ๋๊ฐ ์ฅํฉํด์ ๋งค๊ฐ๋ณ์๊ฐ 4๊ฐ ์ด์์ ๋์ด์ผ ํจ๊ณผ๊ฐ ์๋ค.
๐ ์ด ์ ๋ฆฌ๋ก ์์ฑ์๋ ์ ์ ํฉํฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํด์ผ ํ ๋งค๊ฐ๋ณ์๊ฐ 4๊ฐ์ด์ ๋์ด๊ฐ๋ค๋ฉด ์ ์ธต์ ์์ฑ์ ํจํด์ด๋ ์๋ฐ๋น์ฆ ํจํด๋ณด๋ค๋ ๋น๋ ํจํด ์ฌ์ฉ์ ๊ถ์ฅํ๋ค. ํนํ!! ์ ํ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์ ํ์ ์ด๋ผ๋ฉด ๋๋์ฑ!!
๋น๋๋ ์ ์ธต์ ์์ฑ์ ํจํด๋ณด๋ค ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ฐ๊ธฐ ํธ๋ฆฌํ๊ณ , ์๋ฐ๋น์ฆ๋ณด๋ค ํจ์ฌ ์์ ํ๋ค๋ ์ฅ์ ์ ๊ฐ์ง ํจํด์ด๋ค.