ITEM 5: Dependency Injection
๋ง์ ํด๋์ค๊ฐ ํ๋ ์ด์์ ์์์ ์์กดํ๋ค. ์ด๋ ์ฌ์ฉํ๋ ์์์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ ํด๋์ค(ํ๋ ์ด์์ ์์์ ์์กด)์๋ ์ ์ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ ์ฑ๊ธํด ๋ฐฉ์์ด ์ ํฉํ์ง ์๋ค.
์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์์ฑ์์ ํ์ํ ์์์ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด, ํด๋์ค๊ฐ ์ฌ๋ฌ ์์ ์ธ์คํด์ค๋ฅผ ์ง์ํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ์์์ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ ์์กด ๊ฐ์ฒด ์ฃผ์ ์ ํ ํํ๋ก ์ ์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ, ํ ์คํธ ์ฉ์ด์ฑ์ ๋์ฌ์ค๋ค.
public class SpellChecker {
private final Lexicon dictionayr;
public SpellChecker(Lexicon dictionary){
// null์ด๋ฉด NPE ์๋๊ฒฝ์ฐ objects ๋ฐํ
this.dictionary = Objects.requireNonNull(dictionary);
}
public boolean isValid(String word){}
}
์์ ์์์์๋ ๋จ์ํ ํ๊ฐ์ ์์๋ง ์ฌ์ฉํ์ง๋ง, ์์์ด ๋ช ๊ฐ๋ ์์กด ๊ด๊ณ๊ฐ ์ด๋ป๊ฒ ๋๋ ์ ์๋ํ๋ค. ๋ถ๋ณ์ ๋ณด์ฅํ์ฌ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ์์กด ๊ฐ์ฒด๋ฅผ ์์ฌํ๊ณ ์ฌ์ฉํ ์ ์๋ค. ์์กด ๊ฐ์ฒด ์ฃผ์ ์ ์์ฑ์, ์ ์ ํฉํฐ๋ฆฌ, Builder ๋ชจ๋์ ๋๊ฐ์ด ์ ์ฉ ํ ์ ์๋ค.
Factory๋ ํธ์ถํ ๋๋ง๋ค ํน์ ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ณตํด์ ๋ง๋ค์ด ์ฃผ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋๋ฐ, Factory Method Pattern์ ์์กด ๊ฐ์ฒด ์ฃผ์ ํจํด์ ์์ฉํด์ ๊ตฌํํ ๊ฒ์ด๋ค.
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
Supplier<T>
์ธํฐํ์ด์ค๋ ํฉํฐ๋ฆฌ๋ฅผ ํํํ ์๋ฒฝํ ์์์ด๋ค. ์ด ๋ฐฉ์์ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ๋ ์์ ์ด ๋ช
์ํ ํ์
์ ํ์ ํ์
์ด๋ผ๋ฉด ๋ฌด์์ด๋ ์์ฑํ ์ ์๋ ํฉํฐ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๋ค.
Mosaic create(Supplier<? extends Tile> tileFactory) { ... }
์์กด ๊ฐ์ฒด ์ฃผ์ ์ด ์ ์ฐ์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ ๊ฐ์ ํด์ฃผ์ง๋ง, ์์กด์ฑ์ด ๋๋ฌด ๋ง์ ํ๋ก์ ํธ์์๋ ์ฝ๋๋ฅผ ์ด์ง๋ฝ๊ฒ ํ๋ฉฐ, ์คํ๋ง ๊ฐ์ ์์กด ๊ฐ์ฒด ์ฃผ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด ์ฝ๋์ ์ด์ง๋ฌ์์ ํด์ํ ์ ์๋ค.
Last updated
Was this helpful?