๋ฐ๋๊ณผ ์ค์ฒ๋ผ ์๋ฐํ๋ฉด ๋ฐ๋ก ๋ ์ค๋ฅด๋ ๊ฒ์ด ์์ต๋๋ค. ๋ฐ๋ก "๊ฐ์ฒด ์งํฅ ์ธ์ด" ๋ผ๋ ๊ฒ์ ๋๋ค.
"๊ฐ์ฒด ์งํฅ"์ด๋ ๋ ๊ณ ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ ๊ณ ๋ธ๋ก๋ค์ ์กฐ๋ฆฝํ์ฌ ์ฐ๋ฆฌ๋ ๋ฌด์์ด๋ ๋ง๋ค ์ ์์ต๋๋ค. ๋ ๊ณ ๋ฅผ ์ด์ฉํด์ ๋๋ฌผ์์ ๋ง๋ค์๋ค๊ณ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ๋๋ฌผ์์๋ ๋ ๊ณ ๋ก ๋ง๋ค์ด์ง ์ฌ์๋ ์๊ณ , ํธ๋์ด๋ ์๊ณ , ์ฝ๋ผ๋ฆฌ๋ ์๊ณ , ์ ๊ฐ ์ข์ํ๋ ํ๋ค๋ ์์ต๋๋ค. ํ์ง๋ง ์ฌํ๊ฒ๋ ๋ ์ด์ ํธ๋์ด๊ฐ ์ธ๊ธฐ๊ฐ ์์ด์ ๊ณ ๋ฆด๋ผ ๋ ๊ณ ๋ก ๋ฐ๊พธ๊ณ ์ถ์ต๋๋ค.
์ด๋ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ์ฝ๊ฒ ๋๋ฌผ์์์ ํธ๋์ด ๋ ๊ณ ๋ฅผ ๋นผ๊ณ ๊ณ ๋ฆด๋ผ ๋ ๊ณ ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ํธ๋์ด, ๊ณ ๋ฆด๋ผ๊ฐ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ ๋๋ค. ํธ๋์ด๋ฅผ ๋บ ๋ค๊ณ ํด์ ๊ธฐ์กด์ ์๋ ์ฌ์๋ ํ๋ค ๋ ๊ณ ๋ ์ ํ ์ํฅ์ด ์์ต๋๋ค.
๋ง์ฝ ๋ผ์ด๊ฑฐ ๋ ๊ณ ๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๊ณ , ํธ๋์ด์ ์ฌ์๋ฅผ ๋ง๊ตฌ์ก์ด ์์ด์ ๋ ๊ณ ๋ฅผ ์กฐ๋ฆฝํ๋ค๋ฉด ์ด๋ ์๊น์?
*์ฐธ๊ณ ๋ก ๋ผ์ด๊ฑฐ๋ ํธ๋์ด์ ์ฌ์์ ๊ต๋ฐฐ๋ก ํ์ํ ๋๋ฌผ์ ๋๋ค
ํธ๋์ด์ ์ฌ์๊ฐ ์์ฌ์๊ธฐ ๋๋ฌธ์ ํธ๋์ด๋ง ๋ผ์ด๋ด๊ธฐ๊ฐ ์๋นํ ํ๋ค์ด์ง๋๋ค. ์ด๋ฅผ ๊ฐ์ฒด ์งํฅ์ ์ด์ง ์๋ค๊ณ ํฉ๋๋ค. ์์๊ฐ ์ข ์ด์ํ๊ธด ํ๋ค์.
"CatDog"๋ผ๋ ์ด๋ฆด ์ ํฐ๋น์์ ํด์ค ๋งํ์๋๋ฐ ์์ฃผ ๊ฐ์ฒด ์งํฅ์ ์ด์ง ๋ชปํ๋ค์.
์ด๋ ๋ฏ "๊ฐ์ฒด ์งํฅ" ์ด๋ผ ํ๋ฉด ํ์ฅ์ด ์ฉ์ดํด์ผ ํ๊ณ , ๋ณ๊ฒฝ์ด ์ฝ๋๋ก ์ ์ฐํด์ผ ํฉ๋๋ค.
ํ์ง๋ง "๊ฐ์ฒด ์งํฅ"์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ๊ฐ ๋ง๋ง์น๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ๊ฐ์ฒด ์งํฅ์ ํ๋ก๊ทธ๋๋ฐ์ ์ข ๋ ์ฝ๊ฒ? ํ ์ ์๋๋ก ๋ง๋ ๊ฐ์ด๋๊ฐ "๊ฐ์ฒด ์งํฅ ์ค๊ณ 5๋ ์์น(SOLID)"์ ๋๋ค.
๊ฐ์ฒด ์งํฅ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ํ์ฅ์ด ์ฉ์ดํ๊ณ , ์ ์ฐํ๋ค๋ ๋คํ์ฑ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค. ๋คํ์ฑ์ ํนํ SOLID ์ค OCP, DIP์ ๊ด๋ จ์ด ๋ง์ต๋๋ค.
OCP๋ Open/Closed Principle์ ์ฝ์ด๋ก ์ํํธ์จ์ด ํ์ฅ์๋ ์ด๋ ค์ผ ์์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค๋ ์์น์ ๋๋ค.
DIP๋ Dependency Inversion Principle์ ์ฝ์ด๋ก ๊ตฌํ์ฒด์ ์์กดํ์ง ๋ง๊ณ , ์ญํ (์ธํฐํ์ด์ค)์ ์์กดํด์ผ ํ๋ค๋ ์์น์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฒ์ ์๋ฐ๋ก ๊ฐ๋ฐ์ ํ ๋ ๋๋ฆ ๋คํ์ฑ ์๊ฒ DIP์ OCP๋ฅผ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์ ๋๋ด๊ณ ๋ฑ ์ฝ๋๋ฅผ ๋ค์ฌ๋ค ๋ณด๋ฉด ๋๋ฆ DIP์ OCP๋ฅผ ์ ์ง์ผ ๊ฐ๋ฐํ๋ค๊ณ ๋ฟ๋ฏํดํฉ๋๋ค. ํ์ง๋ง ๋ถ๋ช DIP์ OCP๋ฅผ ์๋ฐฐํ๊ณ ์์ต๋๋ค. ์ ๋ํ ๋งจ ์ฒ์ ์๋ฐ๋ก ๊ฐ๋ฐ์ ํ์ ๋ "์ ์ด๊ฑฐ ์ฉ๋ค! ์ง์ง ๋ด๊ฐ ์งฐ์ง๋ง ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ ์งฐ๋ค. SOLID ์ฝ๋ค~" ํ์ต๋๋ค. ์ ๋ง ๋ฐ๋ณด ๊ฐ์ ์๊ฐ์ด์์ฃ .
๊ทธ๋ฌ๋ฉด ์ด์ DIP์ OCP๋ฅผ ์งํจ๊ฑฐ ๊ฐ์ง๋ง ์ฌ์ค ์๋ฐฐ๋๋ ์ฝ๋๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์๋์ ๊ฐ์ต๋๋ค.
- Car๋ผ๋ ์ญํ (์ธํฐํ์ด์ค)๋ฅผ ๋ง๋ค๊ณ ๊ตฌํ์ผ๋ก๋ K3์ K5๊ฐ ์์ต๋๋ค.
- Engine์ด๋ผ๋ ์ญํ (์ธํฐํ์ด์ค)๋ฅผ ๋ง๋ค๊ณ ๊ตฌํ์ผ๋ก๋ Fuel, Electronic์ด ์์ต๋๋ค.
- Driver๋ผ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ์ด ํด๋ผ์ด์ธํธ๋ K3๋ฅผ ํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
interface Car
public interface Car {
void findCarName();
void findCarBrand();
}
class K3
public class K3 implements Car{
@Override
public void findCarName() {
System.out.println("ํ์ฌ ์ฐจ์ ์ด๋ฆ์ [K3] ์
๋๋ค.");
}
@Override
public void findCarBrand() {
System.out.println("[K3]๋ [KIA]์์ ๋ง๋ค์ด์ก์ต๋๋ค.");
}
}
interface Engine
public interface Engine {
void WayToMove();
}
class Fuel
public class Fuel implements Engine{
@Override
public void WayToMove() {
System.out.println("[์ฐ๋ฃ]๋ฅผ ์ฌ์ฉํด์ ์์ง์
๋๋ค.");
}
}
interface Driver
public interface Driver {
void findOwnCarDetail();
}
class DriverImpl
public class DriverImpl implements Driver{
Car car = new K3();
Engine engine = new Fuel();
@Override
public void findOwnCarDetail() {
car.findCarName();
car.findCarBrand();
engine.WayToMove();
}
}
๋จ์ํ ์ฐจ์ ์ธ๋ถ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฝ๋์ ๋๋ค. ์ฐจ ์ด๋ฆ, ์ฐจ ๋ธ๋๋, ๊ธฐ๋ ๋ฐฉ์์ ์ ์ ์์ต๋๋ค.
์น์ง์ ํด ์๊ธ์ด ์ฌ๋ผ์ K3์์ K5๋ก ์ฐจ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ๋ก ํ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค.
Car car = new K3(); ---> Car car = new K5();
public class DriverImpl implements Driver{
Car car = new K5();
Engine engine = new Fuel();
@Override
public void findOwnCarDetail() {
car.findCarName();
car.findCarBrand();
engine.WayToMove();
}
}
ํน์ ์์ฆ ์นํ๊ฒฝ์ด ๋์ธ๋๊น ์ ๊ธฐ์ฐจ ๋ฒ์ ์ K3๋ก ๋ฐ๊พธ๊ณ ์ถ์ต๋๋ค.
public class DriverImpl implements Driver{
Car car = new K3();
Engine engine = new Electronic();
@Override
public void findOwnCarDetail() {
car.findCarName();
car.findCarBrand();
engine.WayToMove();
}
}
K3๋ฅผ K5๋ก ๋ฐ๊พธ๊ฑฐ๋ Fuel์์ Electronic์ผ๋ก ๋ณ๊ฒฝ์ ํ ๋ ์ฝ๋๋ง ์ด์ง ๋ฐ๊พธ๋ฉด ๋์ ์ผํ๋ณด๋ฉด ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณํ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ ๋ช ๋ฐฑํ DIP์ OCP๋ฅผ ์๋ฐฐํ๊ณ ์์ต๋๋ค.
OCP ์๋ฐฐ
OCP๋ ์์์ ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ ํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋๋ฐ K3๋ฅผ K5๋ก ๋ฐ๊พธ๊ธฐ ์ํด์ ์ฝ๋๋ฅผ ์์ ํด์ค์ผ ํฉ๋๋ค.
DIP ์๋ฐฐ
DIP๋ ์ญํ (์ธํฐํ์ด์ค)์ ์์กดํ๊ณ ๊ตฌํ์๋ ์์กดํ์ง ์์์ผ ํ๋๋ฐ ์ ์์ฝ๋๋ DriverImpl์ด๋ผ๋ ํด๋์ค๊ฐ Car(์ญํ ), K3(๊ตฌํ)์ ๋ชจ๋ ์์กดํ๊ณ ์์ต๋๋ค.
๊ฐ์ํ๋์ ๋ง์ ๋น๋ฆฌ์๋ฉด
"๋ก๋ฏธ์ค์ ์ค๋ฆฌ์ฃ ๊ณต์ฐ์ ํ๋ฉด ๋ก๋ฏธ์ค ์ญํ ์ ๋๊ฐ ํ ์ง ์ค๋ฆฌ์ฃ ์ญํ ์ ๋๊ฐ ํ ์ง๋ ๋ฐฐ์ฐ๋ค์ด ์ ํ๋๊ฒ ์๋๋ค. ์ด์ ์ฝ๋๋ ๋ง์น ๋ก๋ฏธ์ค ์ญํ (์ธํฐํ์ด์ค)์ ํ๋ ๋ ์ค๋๋ฅด๋ ๋์นดํ๋ฆฌ์ค(๊ตฌํ์ฒด, ๋ฐฐ์ฐ)๊ฐ ์ค๋ฆฌ์ฃ ์ญํ (์ธํฐํ์ด์ค)์ ํ๋ ์ฌ์ ์ฃผ์ธ๊ณต(๊ตฌํ์ฒด, ๋ฐฐ์ฐ)์ ์ง์ ์ด๋นํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ๋์นดํ๋ฆฌ์ค๋ ๊ณต์ฐ๋ ํด์ผํ๊ณ ๋์์ ์ฌ์ ์ฃผ์ธ๊ณต๋ ๊ณต์ฐ์ ์ง์ ์ด๋นํด์ผ ํ๋ ๋ค์ํ ์ฑ ์์ ๊ฐ์ง๊ณ ์๋ค."
์ฆ ์ด์ ์ฝ๋๋ ์์ ๊ฐ์ด ๊ตฌํ์ฒด์ ์์กดํ๊ณ ์๋ค.
์ด๋ฒ ๊ธ์์ DIP์ OCP๊ฐ ์๋ฐฐ๋๋ ๊ฒฝ์ฐ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์คํ๋ง์ ์ฐ๋ ๊ฐ์ฅ ์ค์ํ ์ด์ ๊ฐ ๊ฒฐ๊ตญ DIP์ OCP๋ฅผ ํด๊ฒฐํ๊ณ , DI๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ์์ผ์ฃผ๋ ๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค.
๋ค์ ํฌ์คํ ์์๋ DIP์ OCP๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.