[Java] μ€νλ§μ μ μ¬μ©ν κΉ?(2) - OCPμ DIP ν΄κ²° By μμ μλ°
μ§λ ν¬μ€ν μμλ 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λ₯Ό ν΄κ²°ν΄λ³΄κ² μ΅λλ€. μ΄λ μ λ μ μ€νλ§μ μ¬μ©νλ μ§ μ§μμ΄ κ°μμ£ ?