์ง๋ ํฌ์คํ ์์๋ OCP์ DIP๊ฐ ์๋ฐฐ ๋๋ ๊ฒฝ์ฐ์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ์ด๋ฒ์๋ ์คํ๋ง์ด ์๋ ์์ ์๋ฐ๋ก ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค.
์ ๊น ์ง๋ ๊ธ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public class DriverImpl implements Driver{
Car car = new K3();
Engine engine = new Electronic();
@Override
public void findOwnCarDetail() {
car.findCarName();
car.findCarBrand();
engine.WayToMove();
}
}
DriverImpl ์ญํ ์ ๊ตฌํ์ฒด๊ฐ ์ง์ new ํค์๋๋ก ์ ์ธ ๋์ด ์์ต๋๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ผํ๋ณด๋ฉด OCP์ DIP๋ฅผ ์ ์งํจ ๊ฒ ๊ฐ์ง๋ง ์ฌ์ค ์๋๋ผ๊ณ ์ง๋ ํฌ์คํ ์์ ๋ง์๋๋ ธ์ต๋๋ค.
์ด๋ฒ์๋ ๊ฐ์ํ๋์ ๋ง์ ๋น๋ฆฌ๊ฒ ์ต๋๋ค.
"๋ก๋ฏธ์ค์ ์ค๋ฆฌ์ฃ ๊ณต์ฐ์ ํ๋ฉด ๋ก๋ฏธ์ค ์ญํ ์ ๋๊ฐ ํ ์ง ์ค๋ฆฌ์ฃ ์ญํ ์ ๋๊ฐ ํ ์ง๋ ๋ฐฐ์ฐ๋ค์ด ์ ํ๋๊ฒ ์๋๋ค. ์ด์ ์ฝ๋๋ ๋ง์น ๋ก๋ฏธ์ค ์ญํ (์ธํฐํ์ด์ค)์ ํ๋ ๋ ์ค๋๋ฅด๋ ๋์นดํ๋ฆฌ์ค(๊ตฌํ์ฒด, ๋ฐฐ์ฐ)๊ฐ ์ค๋ฆฌ์ฃ ์ญํ (์ธํฐํ์ด์ค)์ ํ๋ ์ฌ์ ์ฃผ์ธ๊ณต(๊ตฌํ์ฒด, ๋ฐฐ์ฐ)์ ์ง์ ์ด๋นํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ๋์นดํ๋ฆฌ์ค๋ ๊ณต์ฐ๋ ํด์ผํ๊ณ ๋์์ ์ฌ์ ์ฃผ์ธ๊ณต๋ ๊ณต์ฐ์ ์ง์ ์ด๋นํด์ผ ํ๋ ๋ค์ํ ์ฑ ์์ ๊ฐ์ง๊ณ ์๋ค."
์ ๋ง ๊ทธ ์ด๋ค ์์๋ณด๋ค ์ต๊ณ ์ ์์์ธ๊ฒ ๊ฐ๋ค์. ๋ฐฐ์ฐ๋ ๋ฐฐ์ฐ์๋ง ๋ชฐ๋ํด์ผํฉ๋๋ค. ๊ณต์ฐ ์ฅ์๋ฅผ ์ ํ๊ณ , ์ญํ ์๋ ๋๊ตด ์บ์คํ ํ ์ง์ ๋ํด์๋ ๋ฐฐ์ฐ๊ฐ ์๋ [๊ณต์ฐ ๊ธฐํ์]๊ฐ ๊ฒฐ์ ํด์ผ ํ๋ ๋ถ๋ถ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฐ ์ญํ ์ ํด์ค [๊ณต์ฐ ๊ธฐํ์]๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฐ์์๋ [๊ณต์ฐ ๊ธฐํ์]๋ฅผ AppConfig๋ผ๋ ํด๋์ค๊ฐ ๋ด๋นํ๊ณ ์์ต๋๋ค.
public class AppConfig {
public Driver driver(){
return new DriverImpl(car(), engine());
}
public Car car(){
return new K3();
}
public Engine engine(){
return new Electronic();
}
}
์ AppConfig๋ ์์ ์๋ฐ๋ก๋ง ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์คํ๋ง์์ ์ ๊ณต๋๋ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉ๋์ง ์์์ต๋๋ค. ์คํ๋ง์ผ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ค์ ๊ธ์์ ์งํํ๊ฒ ์ต๋๋ค.
AppConfig์์ Car ์ญํ (์ธํฐํ์ด์ค)๋ก๋ ์ด๋ค ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง, Engine ์ญํ (์ธํฐํ์ด์ค)๋ก๋ ์ด๋ค ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ์ฃผ์ ํด์ค์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Driver ์ญํ (์ธํฐํ์ด์ค)์ ์์ฑ์๋ฅผ ํตํด ์ธ๋ถ์์ ์์ฑํ ์ ์์ต๋๋ค.
public class DriverImpl implements Driver{
private final Car car;//์ญํ ๋ง ์๋ ค์ฃผ๊ณ ๊ตฌํ์ฒด๋ ๋ฌด์์ธ์ง ์๋ ค์ค ํ์๊ฐ ์๋ค.
private final Engine engine;
public DriverImpl(Car car, Engine engine) {
this.car = car;//์ญํ ์ ์ ํด์ค๋ค.
this.engine = engine;//์ญํ ์ ์ ํด์ค๋ค.
}
@Override
public void findOwnCarDetail() {
car.findCarName();
car.findCarBrand();
engine.WayToMove();
}
}
Driver ๊ตฌํ์ฒด๋ฅผ ์์ ๊ฐ์ด ๋ฐ๊ฟ์ค ์ ์์ต๋๋ค. ์ด์ ์ฝ๋์์๋ new K3(), new Fuel() ์ด๋ฐ์์ผ๋ก ์ง์ ์ญํ ์ ์ง์ ํด์ฃผ์์ต๋๋ค. ํ์ง๋ง ์ ์ฝ๋๋ ์๋ฐ๊ฐ ์ด๋ฅผ ์์์ ์ฃผ์ ์ ์์ผ์ค๋๋ค.
์ด์ ์์๋ ๊ตฌํ์ฒด์ ์ง์ K3, Fuel ์ง์ ํด์ฃผ์๋ค. ํ๋ง๋๋ก ๊ตฌํ ๊ฐ์ฒด๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ค์ค๋ก๋ฅผ ์กฐ์ข ํ์ต๋๋ค. ํ์ง๋ง AppConfig๋ฅผ ์์ฑํ ๋ค๋ก๋ ๊ตฌํ ๊ฐ์ฒด๋ ์ญํ (์ธํฐํ์ด์ค)๋ค๋ง ํธ์ถํ์ง, ๊ตฌํ์ฒด์ ๋ํด์๋ ํธ์ถํ์ง ์์ต๋๋ค. Driver ๊ตฌํ ๊ฐ์ฒด๋ Car, Engine์ด๋ผ๋ ์ญํ ์ ์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ฃผ์ ๋ ๊ฒ์ธ์ง๋ ์ ํ ์ ์ ์์ฃ .
์ด๋ ๋ฏ ํ๋ก๊ทธ๋จ์ ๋ํ ์ ์ด ํ๋ฆ์ ์ธ๋ถ๊ฐ ์๋ AppConfig๊ฐ ๊ฐ์ง๊ฒ ๋๋๋ฐ ์ด๋ฅผ [์ ์ด์ ์ญ์ (IoC, Inversion of Control)]์ด๋ผ๊ณ ํฉ๋๋ค. ๋ํ AppConfig๊ฐ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ์์ผ์ฃผ๋ ๊ฒ์ [์์กด๊ด๊ณ ์ฃผ์ (DI, Dependency Injection)]๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ AppConfig์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ DI ์ปจํ ์ด๋(IoC ์ปจํ ์ด๋)๋ผ๊ณ ํฉ๋๋ค.
public class DrivingApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
Driver driver = appConfig.driver();
driver.findOwnCarDetail();
}
}
์ด๋ฐ ์์ผ๋ก ์์์ ๊ฐ์ฒด๊ฐ ์์์ ์ฃผ์ ๋๋ฏ๋ก ์ธ๋ถ์์ AppConfig๋ฅผ ๋ณด์ง ์๋ ํ ์ด๋ ํ ์ญํ ์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ง ์์ ์์ฃ . ์ ํ์๋ ์์ฃ . ์ฐ๋ฆฌ๊ฐ ์ด์ ํ๋๋ฐ ์์ด์ ์ด์ ํ๋ ๋ฐฉ๋ฒ๋ง ์๋ฉด ๋์ง ์์ง์ด ์ด๋ป๊ฒ ์๋ํ๊ณ , ๋ฐํด๋ ์ด๋ป๊ฒ ๊ตด๋ฌ๊ฐ๋ ์ง ์ ํ์๋ ์์์์? ํ๋ฌผ๋ฉฐ ์๋์ฐจ๋ง๋ค ์์ง์ ์ข ๋ฅ๊ฐ ๋ค๋ฅธ๋ฐ ๊ทธ๊ฑฐ ๋ชฐ๋ผ๋ ์ด์ ๋ง ์ ํ์์์.
๋ง์ฝ K3 ์ ๊ธฐ์ฐจ๊ฐ ์๋ K5 ์ฐ๋ฃ์ฐจ๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด AppConfig์ ์ฝ๋๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค.
public class AppConfig {
public Driver driver(){
return new DriverImpl(car(), engine());
}
public Car car(){
return new K5();
}
public Engine engine(){
return new Fuel();
}
}
์ฝ๋์์ ์ ์ ์๋ฏ์ด Driver ๊ตฌํ์ฒด์ ๋ ์ด์ ์ง์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ๊ตฌํ์ฒด์ ์์กดํ์ง ์์ฃ . ๋ํ ์ ๊ธฐ๋ฅผ ์ฐ๋ฃ๋ก ๋ฐ๊ฟ ๋ ๊ตฌํ์ฒด์ ์ฝ๋๋ฅผ ์ง์ ์ ์ผ๋ก ์์ ํ ํ์๋ ์์ต๋๋ค. AppConfig๋ผ๋ [๊ณต์ฐ ๊ธฐํ์]๊ฐ ๋ค ํด์ฃผ๋๊น์.
์ด๋ฒ ๊ธ์์ AppConfig๋ผ๋ DI ์ปจํ ์ด๋๋ฅผ ์ด์ฉํด์ OCP์ DIP๋ฅผ ํด๊ฒฐํด ๋ณด์์ต๋๋ค. ์ง๊ธ ๋น์ฅ์ ์ฝ๋ ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ AppConfig๋ฅผ ๋ง๋ค์ด์ ์ฌ๊ธฐ๋ค๊ฐ ์ ์ธํ๋ ๊ฒ์ด ์ด๋ ต์ง ์์ต๋๋ค. ํ์ง๋ง ์ฝ๋๋์ด ๋ง์์ง ๊ฒฝ์ฐ AppConfig๋ก๋ง ๊ด๋ฆฌํ๊ธฐ ํ๋ค์ด์ง๋๋ค.
๋ฐ๋ผ์ ๋ค์ ๊ธ์์๋ ์คํ๋ง์ ์ฌ์ฉํ์ฌ OCP์ DIP๋ฅผ ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ์ ๋ ์ ์คํ๋ง์ ์ฌ์ฉํ๋ ์ง ์ง์์ด ๊ฐ์์ฃ ?