[OOP] ๊ฐ์ฒด์งํฅ ์ค๊ณ ์๋ฆฌ
๊ฐ์ฒด์งํฅ ์ค๊ณ ์๋ฆฌ
1. SOLID
SOLID๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์๋ฆฌ ์ค ๊ฐ์ฅ ์ค์ํ ๋ค์ฏ๊ฐ์ง ์๋ฆฌ SRP(Single Responsibility Principle), OCP(Open-Closed Principle), LSP(LIskov Substitution Principle), ISP(Interface Substitution Principle), DIP(Dependency Inversion Principle)๋ฅผ ๋งํ๋ค.
1.1 SRP
๋จ์ผ ์ฑ ์ ์๋ฆฌ A class should have only one reason to change.
- ์ํํธ์จ์ด์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ค๊ณ ์๋ฆฌ ์ค ํ๋๋ ๋ชจ๋์ ์์ง์ฑ์ด ๋์์ผ ํ๋ค๋ ๊ฒ์ด๋ค. (high-cohesion) ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๊ธฐ๋ณธ ๋ชจ๋์ ํด๋์ค์ด๋ค. SRP์ ์ํ๋ฉด ํ ํด๋์ค๋ ๋จ์ผ ์ฑ ์์ ๊ฐ์ ธ์ผ ํ๋ค.
- ํ ํด๋์ค๋ ์์ ๋์ด์ผ ํ ์ด์ ๊ฐ ํ๋ ๋ฐ์ ์์ด์ผ ํ๋ค.
- ํ ํด๋์ค๋ ์ฌ๋ฌ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ์งํ ์ ์๊ณ , ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ง๋ง SRP์ ์ํ๋ฉด ์ด๋ค์ ๋ชจ๋ ๊ณตํต์ผ๋ก ํ ๊ฐ์ง ์ฑ ์์ ์ํด ํ์ํด์ผ ํ๋ค.
- ์๋ฅผ ๋ค์ด ์ง์์ ๋ณด๋ฅผ ์ ์งํ๋ Employee ํด๋์ค์ ๊ธ์ฌ๋ฅผ ๊ณ์ฐํ๋ ๋ฉ์๋์ ์ง์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ด ํด๋์ค๋ฅผ ์์ ํ ์ด์ ๋ ๋ช๊ฐ์ง์ธ๊ฐ? ์ต์ ๋๊ฐ์ง์ด๋ค.
- ๊ธ์ฌ๋ฅผ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋๋ฉด ๋ณ๊ฒฝ๋์ด์ผ ํ๊ณ + ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฐ๋๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ์ฝ๋ ๋ชจ์ต์ด ๋ฐ๋์ด๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
- ๋ชจ๋ ๊ฒ์ ๊ทธ๊ฒ์ ์กด์ฌํ ์์น๊ฐ ์๊ณ , ๋ชจ๋ ๊ฒ์ ์๋ ์์ด์ผ ํ ๊ณณ์ ์์ด์ผ ํ๋ค.
- ํด๋์ค๋ฅผ ์ค์์ค ํฌ์ผ ๋์ดํ์ฒ๋ผ ๋ง๋ค๋ฉด ์๋๋ค.
- ํ ๊ฐ์ง ์ผ๋ง ํด์ผ ํ๊ณ , ๊ทธ ์ผ์ ์ ํด์ผ ํ๋ค.
- ํ ์ ์๋ค๊ณ ํ์ฌ ๊ทธ๊ฒ์ ๊ผญ ํด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
1.2 OCP
์ด๋ฆผ ๋ซํ ์๋ฆฌ Classes should be open for extension, but closed for modification.
- OCP์ ์ํ๋ฉด ํด๋์ค๋ ํ์ฅ์ ๋ํด์ ์ด๋ ค ์์ง๋ง ๋ณํ์ ๋ํด์๋ ๋ซํ ์์ด์ผ ํ๋ค. ํด๋์ค๋ ์ค๊ณ ํ ๊ตฌํ์ด ๋๋ ์ ์์ ์ผ๋ก ๋์ํ๋ฉด ๋ ์ด์ ์์ ํ ํ์๊ฐ ์์ด์ผ ํใ ใด๋ค๋ ์ธก๋ฉด์์ ๋ซ์ ์ ์์ด์ผ ํ๋ค.
- ์ด๋ ๊ฒ ๋ซ์ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ด์ผ ํ๋ค. ํด๋์ค๊ฐ ์ ๊ธฐ๋ฅ์ด ํ์ํ๋๋ผ๋ ์ด ํด๋์ค๋ฅผ ์์ ํ์ง ์๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ด์ผ ํ๋ค.
- ๋ซํ ์๋ ํด๋์ค๋ฅผ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋ค.
- ์์์ ํ์ฉํจ -->> ์์์ is-a ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํด์ผ ํ๋ฉฐ, ํด๋์ค ๊ฐ ๊ด๊ณ๊ฐ ๊ณ ์ ๋๊ธฐ ๋๋ฌธ์ ์ ์ฐํ์ง ๋ชปํ ์ ์๋ค.
- ํฌํจ๊ด๊ณ๋ฅผ ํ์ฉํจ
- ๋ซํ ์๋ ํด๋์ค๋ฅผ ๋ ์ ์ฐํ๊ฒ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ํฌํจ ๊ด๊ณ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค. ํด๋์ค์ ์ด๋ค ๊ธฐ๋ฅ์ ๋ค๋ฅด ํด๋์ค์ ์์ํ๊ณ ๊ทธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ ํ์ ๋ฉค๋ฒ ๋ณ์์ ์ ์งํ๋ฉด ์ธ์ ๋ ์ง ์ ์งํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๊พธ์ด ๊ธฐ๋ฅ์ ๋ฐ๊ฟ ์ ์๋ค. ๋ ํฌํจ ๊ด๊ณ๋ฅผ ์ด์ฉํ๋ฉด ๋ค์ํ ๊ฒ๋ค์ ์กฐํฉํ์ฌ ์๋ก์ด ํน์ฑ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค. ๊ธฐ๋ฅํ์ฅ๊ณผ ๊ด๋ จํ์ฌ ๋ ์๊ฐํด์ผ ํ๋ ์ค๊ณ ์๋ฆฌ๋ ํ๋ก๊ทธ๋จ์์ ๋ณํ ์ ์๋ ๋ถ๋ถ๊ณผ ๋ณํ์ง ์๋ ๋ถ๋ถ์ ๊ตฌ๋ถํ๋ ์๋ฆฌ์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ๋์ ์ ์ถ์ ํ์ ์ ์์กดํ๋ ์๋ฆฌ์ด๋ค.
1.3 LSP
๋ฆฌ์ค์ฝํ ์นํ ์๋ฆฌ If S is a subtype of T, then objects of type T in a program may be replaced with objects of type S without altering any of the desirable properties of that program.
๊ฐ์ฒด์งํฅ์ ๊ฐ์ฅ ํต์ฌ ์์ ์ค ํ๋๊ฐ ์์์ด๋ค. ์์์ ํ ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ์๋ก์ด ํด๋์ค๋ฅผ ์ฝ๊ฒ ์ ์ํ ์ ์๋๋ก ํด์ค๋ค. ํด๋์ค P๋ฅผ ์์ํ์ฌ ํด๋์ค C๋ฅผ ์ ์ํ๋ฉด ํด๋์ค C๋ P์ ๋ชจ๋ ์ํ์ ํ์๋ฅผ ๋ค์ ์ ์ํ์ง ์์๋ ๋๋ค.
- ์์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๊ณ , ์ฝ๋ ์ค๋ณต์ ์์ ์ค๋ค. ํ์ง๋ง ์ด๊ฒ๋ง์ด ์์์ ์ฅ์ ์ ์๋๋ค. ์์์ ์์ ํด๋์ค ํ์ ์ ํ์ ํด๋์ค๋ฅผ ์์ฐ๋ฅด๋ ๊ณตํต ๋ฆฌ๋ชจ์ปจ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค. ์ฆ ์์ ํ์ ๋ณ์์๋ ๋ค์ํ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์ ์งํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋คํ์ฑ์ ํ์ฉํ ์ ์๊ณ , ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
- ์ฝ๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๊ณ ๋ฌด์กฐ๊ฑด ์์ํ๋ฉด ๋งค์ฐ ์ด์ํ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค. ์์์ ๋ฐ๋์ is-a ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ค. Pet ํด๋์ค๊ฐ ์ด๋ฆ์ ์ ์งํ๊ณ ์๋ค๊ณ ํ์ฌ Pet์ ์์ํ์ฌ ์ฌ๋์ ์ ์ํ๋ฉด ์ฌ๋์ ์ ์๋๋ฌผ์ด๋ค ๋ผ๋ ๋ช ์ ๊ฐ ์ฑ๋ฆฝํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ ์์ ๊ด๊ณ๋ผ ํ ์ ์๋ค.
- ๊ฐ์ฒด์งํฅ์์๋ ํด๋์ค๋ interface๋ฅผ ์ด์ฉํ์ฌ ์ ํด๋์ค๋ฅผ ์ ์ํ ์ ์๋๋ก ํด์ค๋ค. ์ด์ ๊ด๋ จํ์ฌ subclassing์ด๋ผ๋ ๊ฐ๋
๊ณผ subtyping์ด๋ผ๋ ๊ฐ๋
์ด ์๋ค.
- subclassing : ํ ํด๋์ค์ ๋ด๋ถ ๊ตฌํ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ
- subtyping : ์ธ๋ถ ๋ชจ์ต๋ง ์ฌ์ฌ์ฉํ๋ ๊ฒ
- subcalssing ํ๋ฉด subtyping์ด ๋ฌด์กฐ๊ฑด ์ ๊ณต๋์ง ์๋๋ค.
- ํ์ง๋ง LSP ์๋ฆฌ์ ์ํ๋ฉด subclassing๋ subtyping์ ์ ๊ณตํด์ผ ํ๋ค.
- LSP๊ฐ ์๋ฐฐ๋์ง ์๋๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ค์์ ๋ณด์ฅ
- ๋ฉ์๋ ์ธ์์ ๋ฐ๋ณ์ฑ(contravariance)
- ๋ฉ์๋ ๋ฐํํ์ ์ ๊ณต๋ณ์ฑ(covariance)
- ๊ณต๋ณ์ฑ์ด๋ ์์ ํด๋์ค์์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋ ํน์ ํ์ ์ด ํน์ํ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๊ณ , ๋ฐ๋ณ์ฑ์ ์ฌ์ ์ํ๋ฉด์ ์ผ๋ฐํ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- ๋ฉ์๋ ์ธ์๋ ๋ณํ์ง ์๊ฑฐ๋ ์ผ๋ฐํํ๋ฉด ํ์ ์์ ์ฑ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ, ๋ฉ์๋ ๋ฐํํ์ ์ ๋ณํ์ง ์๊ฑฐ๋ ํน์ํํ๋ฉด ํ์ ์์ ์ฑ์ ๋ฌธ์ ๊ฐ ์๋ค.
- ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๊ฐ ์์ ๋, CatShop์ ๋ฉ์๋์ ์ธ์์ ๋ฐํํ์ ์ ๋ชจ๋ ํน์ํํ์ฌ ์ฌ์ ์ํ ์๊ณ , DogShop์ ๋ฉ์๋์ ์ธ์์ ๋ฐํํ์ ์ ๋ชจ๋ ์ผ๋ฐํํ์ฌ ์ฌ์ ์ํ๊ณ ์๋ค.
class PetShot{ Pet getPet(){} void addPet(Pet pet){} } class CatShop extends PetShot{ Cat getPet(){} // ๊ณต๋ณ์ฑ O void addPet(Cat cat){} // ์ฌ์ ์๋ก ์ธ์๋์ง ์์ } class DogShop extends PetShot{ Object getPet(){} // ๋ฐ๋ณ์ฑ X void addPedt)Object pet){} // ์ฌ์ ์๋ก ์ธ์ํ์ง ์์ ๋ฐ๋ณ์ฑ }
- ์๋ฐ๋ ๋ฉ์๋ ๋ฐํํ์ ์ ๊ณต๋ณ์ฑ์ ์ง์ํ์ง๋ง ์ธ์์ ๋ฐ๋ณ์ฑ์ ์ง์ํ์ง ์๋๋ค. ์๋ฐ๋ ์ธ์์ ๊ฒฝ์ฐ์๋ ์ ํํ ๊ฒ ์ผ์นํ์ฌ์ผ ํ๋ค. C++๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. C#์ ๋ฉ์๋ ๋ฐํํ์ ์ ๊ณต๋ณ์ฑ๋ ์ง์ํ์ง ์๋๋ค. ์๋ฐ๋ checked ์์ธ์ ๊ฒฝ์ฐ ์์์ด ๋ ๋ง์ด ๋ฐ์ํ๋ฉด ๋ฌธ๋ฒ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์ฃผ๊ณ ์์ง๋ง ์์ธ ๋ฐ์์ ๋ฌธ๋ฒ์ ์ผ๋ก ์๊ฒฉํ๊ฒ ๊ฒ์ฌํด ์ฃผ๋ ์ธ์ด๋ ๊ฑฐ์ ์๋ค.
- ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋ ๋ฌธ๋ฒ์ ์ธ ์ธก๋ฉด๋ฟ๋ง ์๋๋ผ ๋ค์๊ณผ ๊ฐ์ ๋
ผ๋ฆฌ์ ์ธก๋ฉด๊น์ง ๊ณ ๋ คํด์ผ LSP๊ฐ ์๋ฐฐ๋์ง ์๋๋ค.
- ๋ฉ์๋์ ์ฌ์ ์กฐ๊ฑด์ ๊ฐํ๋์ง ์์์ผ ํ๋ค.
- ๋ฉ์๋์ ์ฌํ ์กฐ๊ฑด์ ์ฝํ๋์ ์์์ผ ํ๋ค.
- ์์ ํ์ ์ ๋ถ๋ณ ์กฐ๊ฑด์ ๊ณ์ ์ ์ง๋์ด์ผ ํ๋ค.
- (ํ์คํ ๋ฆฌ ๊ท์น) ๊ฐ์ฒด๋ ์์ ์ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ํ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ด์ผ ํ๋ค.
1.4 ISP
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์๋ฆฌ Clients should not be forced to depend upon interfaces that they do not use.
- ISP ์๋ฆฌ๋ ํด๋์ค๋ ์์ ์ด ํ์ํ์ง ์๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ๊ฐ์๋์ง ์์์ผ ํ๋ค๋ ์๋ฆฌ์ด๋ค. ์ด ์๋ฆฌ์ ์ถฉ์คํ๊ธฐ ์ํด ํด๋์ค๋ interface๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋์ ์๋ ์ต์ํ๋์ด์ผ ํ๋ค. ์์์ ์ ์ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ์์ ํด๋์ค๊ฐ ์์ํ๋ ๋ฉ์๋๋ฅผ ์ทจ์ฌ ์ ํํ ์ ์๋ค. ์ด ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋น ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ํ์ ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ง๋ง, ์ด ์๋ฆฌ์ ์ํ๋ฉด ์ด๊ฒ์ ์๋ชป๋ ์ค๊ณ์ ๊ฒฐ๊ณผ์ ํด๋นํ๋ค. ์ด ๋ฌธ์ ๋ LSP ์ธก๋ฉด์์๋ ์ดํด๋ณผ ์ ์๋ค.
- ์ด์ ์๋ ๊ฒ์ ์ ์ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๋ฅผ ์ ์
public interface LivingThing{ void eat(); void walk(); void swim(); void fly(); }
- ์ง๊ด์ ์ผ๋ก ์ด์ ์๋ ๋ชจ๋ ๊ฒ์ด ๋ ์ง ๋ชปํ๊ณ , ์์๋ ๋ชปํ๊ณ , ๋ ์์ ๊ฑธ์ ์ ์๋ค. ๋ฐ๋ผ์ ์ฝ๊ฒ ์๋ชป ์ ์๋ ๊ฒ์์ ์ ์ ์๋ค. ๋ชจ๋ ์ด์ ์๋ ๊ฒ์ ๋จน์ด์ผ ํ๊ธฐ ๋๋ฌธ์ eat๋ง ์ ์งํ๊ณ ๋ค๋ฅธ 3๊ฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
public interface LivingThing{
void eat();
}
public interface LivingInSky extends LivingThing{
void fly();
}
public interface LivingInWater extends LivingThing{
void swim();
}
public interface LivingOnLand extends LivingThing{
void walk();
}
- ์ค๋ฆฌ, ๊ฐ๊ตฌ๋ฆฌ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
public class Duck implements LivinInSky, LivinInWater, LivinOnLand{
}
public class Frog implements LivinInWater, LivinOnLand{
}
- ISP๋ฅผ ๊ทน๋จ์ ์ผ๋ก ์ ์ฉํ๋ฉด ์ ์์ฒ๋ผ ๋จ์ผ ๋ฉ์๋ interface๋ง ์ฌ์ฉํ ์ ์๋ค. ์ค์ ๋ก ๋จ์ผ ๋ฉ์๋ interface๋ฅผ ์ฌ์ฉํ๋ฉด ISP๊ฐ ์๋ฐฐ๋ ์ ์๋ค.
- ํ์ง๋ง ํญ์ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒ๊น์ง ๋ถ๋ฆฌํ๋ ๊ฒ์ ์ ์ ํ์ง ์๋ค.
- ์๋ฅผ ๋ค์ด ์๋ฃ๊ตฌ์กฐ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด size, isEmpty ๋ฑ์ ํจ๊ป ์ ์ํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
public class Collection{ int size(); boolean isEmpty(): }
- interface A์ f๋ผ๋ ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์๋ค๊ณ ํ์. ์ด interface๋ฅผ ๊ตฌํํ๋ ์ฌ๋ฌ ํด๋์ค ์ค์ ๋๋ค์๊ฐ ๊ณตํต์ ์ผ๋ก g๋ผ๋ ๋ฉ์๋๊ฐ ํ์ํ๋ค๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ISP์ ์ํ๋ฉด ์ด๊ฒ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ผ๊น? ์ด ๊ฒฝ์ฐ ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ X๋ ์ ๋ฉ์๋ g๊ฐ ํ์ํ ํด๋์ค์ด๊ณ , Y๋ g๊ฐ ํ์์๋ ๊ธฐ์กด A๋ฅผ ๊ตฌํํ๊ณ ์๋ ํด๋์ค๋ผ ํ์.
- ๋ฐฉ๋ฒ1. A์ g๋ฅผ ์ถ๊ฐํจ. X๋ ์์ ์ ๋ง๊ฒ g๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํจ. Y๋ g๋ฅผ ๋น ๋ฉ์๋๋ก ์ฌ์ ์ํ์ฌ ๋ฌธ์ ๊ฐ ์๋๋ก ํจ
- ๋ฐฉ๋ฒ 2. A๋ฅผ ์์ํ๋ ์ interface B๋ฅผ ์ ์ํ๊ณ B์ g๋ฅผ ์ ์ธํจ. X๋ interface B๋ฅผ ๊ตฌํํ๋๋ก ์์ ํ๊ณ ์์ ์ ๋ง๊ฒ g๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ๊ณ , Y๋ ์์ ์์ด ์ฌ์ฉํจ
- ๋ฐฉ๋ฒ 3. ์ interface B๋ฅผ ์ ์ํ๊ณ B์ g๋ฅผ ์ ์ธํจ. lstinlineX๋ interface B๋ฅผ ์ถ๊ฐ ๊ตฌํํ๋๋ก ์์ ํ๊ณ ์์ ์ ๋ง๊ฒ g๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํจ. lstinlineY๋ ์์ ์์ด ์ฌ์ฉํจ
- ์๋ฐ 8 ์ดํ์๋ ๋ฐฉ๋ฒ 1์ ์ฌ์ฉํ ๋ g๋ฅผ ์ ์ธ๋ง ํ๋ ๊ฒ์ด ์๋๋ก ๊ธฐ๋ณธ ๋น ๋ฉ์๋๋ก ์ ์ํ๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ ์ง๋ก Y๋ ์์ ์์ด ์ฌ์ฉํ ์ ์๋ค.
1.5 DIP
์์กด๊ด๊ณ ๋ค์ง๊ธฐ ์๋ฆฌ Depend upon abstractions. Do not depend on concrete classes.
- ํ ํด๋์ค A๋ฅผ ๊ตฌํํ ๋ ๋ค๋ฅธ ํด๋์ค B๋ฅผ ์ฌ์ฉํ๋ฉด A๋ B์ ์์กดํ๋ค๊ณ ๋งํ๋ค. ๋ ๊ฐ ๊ด๊ณ๊ฐ ์์๊ณผ ๊ฐ์ด ์ ์ ์ธ์ง ๋์ ์ธ์ง ์๊ด์์ด ๋ ํด๋์ค ๊ฐ ๋๋ ๋ ํด๋์ค ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๊ฐ ํ์ฑ๋๋ฉด ๋ ์ค ํ๋๋ ๋ค๋ฅธ ํ๋๋ฅผ ์์กด ํ๋ค๊ณ ๋งํ๋ค. ํ ๋ชจ๋์ ๊ฒฐํฉ์ฑ์ ๋ฎ์์๋ก(low-coupling) ํจ๊ณผ์ ์ด๋ผ๋ ์๋ฆฌ ๋งค์ฐ ์ค๋๋ ์ํํธ์จ์ด ์๋ฆฌ์ด๋ค. ์ฆ, ์์กด๊ด๊ณ๊ฐ ์ ์์๋ก ํจ๊ณผ์ ์ด๋ค.
- DIP ์๋ฆฌ๋ ์์กด์ ํ๋๋ผ๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ๋์ ์ ์์ ์ถ์ ํ์
์ด๋ interface ์ ์์กดํด์ผ ํ๋ค๋ ์๋ฆฌ ์ด๋ค. ๋ฐ๋ผ์ ์ด ์๋ฆฌ์ ์ถฉ์คํ๊ฒ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฆฌํํ ๋ง์ด ํ์ํ๋ค.
- ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ์ง์ ์ฐธ์กฐํ๋ ๊ฒ์ด ์์ผ๋ฉด ๊ฐ์ ์ฐธ์กฐํ๋๋ก ๋ฐ๊พธ์ด์ผ ํ๋ค.
- ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ํ์๋ค์ ์ถ์ ํด๋์ค๋ interface๋ก ์ผ๋ฐํํด์ผ ํ๋ค.
- ์์ ๋์ ์ ํฌํจ ๊ด๊ณ๋ฅผ ํ์ฉํ์ฌ์ผ ํ๋ค.
public class OrderFood{
private Baemin finder = new Bamin();
public List<Restaurant> getRestaurantByType(FoodType type){
return finder.findAll(type);
}
}
- ์ด ์์์๋ OrderFood ํด๋์ค๋ Baemin์ด๋ผ๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์์กดํ๊ณ ์๋ค. ์ด ๊ฒฝ์ฐ ํด๋์ค ๊ด๊ณ๋์์ ํ์ดํ๊ฐ OrderFood์์ Baemin ๋ฐฉํฅ์ผ๋ก ํฅํ๊ฒ ๊ทธ๋ฆฌ๊ฒ ๋๋ค.
- ๋ค์๊ณผ ๊ฐ์ interface๋ฅผ ์ ์
public interface FoodDeliveryFinder{
List<Restaurant> findAll(FoodType type);
}
- interface๋ฅผ ๊ตฌํํ๋๋ก Baemin์ ์์ ํ๊ณ , OrderFood ํด๋์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์๋ค๊ณ ํ์.
public class OrderFood{
private FoodDeliveryFinder finder = null;
public OrderFood(FoodDeliverlyFinder finder){
this.finder = Objects.requireNonNull(finder);
}
public void setFoodDeliveryFInder(FoodDeliverlyFInder finder){
this.finder = objects.requireNonNull(finder);
}
public List<Restaurant> getREstaurantByType(FoodType type){
return finder.findAll(type);
}
}
- OrderFood ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค๊ณ ๊ฐ์
OderFood orderFood = new OrderFood(new Baemin());
- ์ด์ฒ๋ผ ์์ ์ ํ๋ฉด OrderFood๋ ๊ถ๊ทน์๋ Baemin ํ์ ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง๋ง OrderFood๋ Baemin์ ๋ ์ด์ ์์กดํ์ง ์๋๋ค. ํด๋์ค ๊ด๊ณ๋๋ฅผ ๊ทธ๋ ค๋ OrderFood์ Baemin ๊ฐ์ ํ์ดํ๊ฐ ์ฐ๊ฒฐ๋์ง ์๋๋ค. ์ด ์ธก๋ฉด์์ ์์กด๊ด๊ณ ๋ค์ง๊ธฐ๋ผ ํ๋ ๊ฒ์ด๋ค.
- ์์กด๊ด๊ณ๋ฅผ ๋ค์ง๊ธฐ ์ํด์๋ ๋ฌด์์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ๊ณผ ์ธ์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํด์ผ ํ๊ณ , ์ธ์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ๊ณผ ๋ฌด์์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ์ ์๋ก ๋ชจ๋ฅด๊ฒ ํด์ผ ํ๋ค. ์ด ์์์ ์์์ ์ ์ฐพ๋ how๋ Baemin์ด ๋ด๋นํ์ง๋ง ์ธ์ ์ด๊ฒ์ ์ฌ์ฉํ ์ง๋ OrderFood ํด๋์ค๊ฐ ๊ฒฐ์ ํ์ง๋ง ์๋ก ์์กดํ์ง ์๋๋ค. ์ด์ ๊ฐ์ด ๊ด๊ณ๋ฅผ ํด๋์ค๋ฅผ ์ ์ํ ๋ ๊ณ ์ ํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์๋๋ก ํ๋ ๊ฒ์ ๊ด๊ณ ์ฃผ์ (dependency injection)์ด๋ผ ํ๋ค.
- ๋ฌด์์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ๊ณผ ์ธ์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ๋ ๋ ๋ค๋ฅธ ์๋ก GUI์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ interface๋ฅผ ์๊ฐํด ๋ณผ ์ ์๋ค. ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ์๊ฐ ๋ฌด์์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ์ด๊ณ , ์ฌ๊ฑด ๋ฐ์์ด ์ธ์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ์ด๋ค. ์ฆ, interface๋ what๊ณผ how๋ฅผ ๋ถ๋ฆฌํด ์ฃผ๋ฉฐ, ์ด๋ฅผ ํตํด how์ when๋ ๋ถ๋ฆฌํ ์ ์๋ค. interface๋ฅผ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ์ด interface๋ฅผ ์ฌ์ฉํ๋ ์ธก์ด ์ธ์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
- ๊ด๊ณ ์ฃผ์ ์ด ์์กด๊ด๊ณ๋ฅผ ๋ค์ง๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋ค. ์์ ๊ด๊ณ์์๋ ์์ ํด๋์ค์ ํ์ ๊ตฌํ์ ์ผ๋ถ๋ฅผ ์์ํ์ง๋ง ์ด๋ค ์์ ํด๋์ค๊ฐ ์ฌ์ง ๋ถ๋ชจ ํด๋์ค๋ ๋ชจ๋ฅด๋ ์ํ์์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ ์ํ ์ ์๋ค.
public class Person{
private String naem;
prvate Pet pet;
public void setPet(Pet pet){
this.pet = pet;
}
}
์์กด๊ด๊ณ ์ฃผ์
- OCP๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ ํฌํจ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํ ๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์ ์ ์ด์ฉ ํ์ฌ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ์ํ์ง ์๊ณ ์์ ๊ด๊ณ๋ ๊ตฌ์ฒดํ ๊ด๊ณ์์ ์์ ํ์ ์ ์ด์ฉํ์ฌ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ์ํ๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ๊ทธ๋ฆผ 1.1์ ๊ฐ์ด ์ฌ๋๊ณผ ๊ทธ ์ฌ๋์ด ๊ธฐ๋ฅด๋ ์ ์๋๋ฌผ์ ๋ชจ๋ธ๋งํ๊ธฐ ์ํด Person ํด๋์ค๋ฅผ ์ ์ํ๋ฉด์ Pet ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์์๊ณ์ธต๋์์ ๋จ๋ง์ ํด๋นํ๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ธ Siamese๋ฅผ ์ ์งํ๋ ๊ฒ์ ํฐ ์ฐจ์ด๊ฐ ์๋ค.
- ์ ์๋ ๋ค์ํ ์ ์๋๋ฌผ์ ์ ์งํ ์ ์๊ณ ์ฌ์ง์ด ๋์ค์ ์๋ก์ด ์ ์๋๋ฌผ์ ์ ์ํ๋๋ผ๋ ์ด ์ ์๋๋ฌผ์ ์กฐ์ ํด๋์ค๊ฐ Pet์ด๋ฉด Person ํด๋์ค๋ฅผ ์ฌ์ปดํ์ผ๋์ง ์๋๋ผ๋ Person ๊ฐ์ฒด๋ ์ด ์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ ์งํ ์ ์๋ค. ์ฆ, Pet ์๋์ ์ ๋ง์ ํด๋์ค๋ค์ด ์์ ์ ์์ง๋ง Person์ ์ด๋ค์ ๋ํ ์ง์์์ด ์ด๋ค์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์คํ๋๋ฉด ํด๋น ๊ฐ์ฒด๋ ํน์ ํ ์ข ๋ฅ์ ์ ์๋๋ฌผ๊ณผ ๊ด๊ณ๋ฅผ ๋งบ๊ฒ ๋๋ค.
p.setPet(new SiberianHusky());
๊ธฐํ ์๋ฆฌ
1. ๋ณํ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ถ๋ถ์ ์ถ์ํํด๋ผ
- ๋ณํ ์ ์๋ ๋ถ๋ถ์ ํฅํ ํ์ฅ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ์ค๊ณ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. OCP์ ๋งค์ฐ ๋ฐ์ ํ ๊ด๋ จ์ด ์๋ ์๋ฆฌ์ด๋ค. ์ด ์๋ฆฌ๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ์ง ์๋๋ผ๋ ๋ ์ ์ฉํด์ผ ํ๋ ์๋ฆฌ์ด๋ค.2. ๊ตฌ์ฒด์ ํ์ ์ ์์กดํ๋ ๊ฒ์ด ์๋๋ผ ์ถ์ ํ์ ์ ์์กดํด๋ผ
- ๊ตฌ์ฒด์ ํ์ ์ ์์กดํ๋ฉด ์ ์ฐ์ฑ์ด ๋จ์ด์ง ์๋ฐ์ ์๋ค. ๋ฐ๋ฉด์ ์ถ์ ํ์ ์ ์์กดํ๋ฉด ์ค์ ๊ด๊ณ๋ฅผ ๋งบ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ์ฝ๋ ์์ ์์ด ๋ฐ๊ฟ ์ ์์ผ๋ฉฐ, ๋ฏธ๋์ ๊ตฌํํ ๊ฐ์ฒด์๋ ์ํธ์์ฉํ ์ ์๋ค.3. ๋์จํ ์ฐ๊ฒฐ์ ์ ํธํด๋ผ
- ์๋ก ์ํธ์์ฉํด์ผ ํ๋ ๊ฐ์ฒด ๊ฐ์๋ ๋์จํ ์ฐ๊ฒฐ์ ์ ํธํ๋ผ๋ ๊ฒ์ ๊ตฌ์ฒด์ ํ์ ๋์ ์ ์ถ์ ํ์ ์ ์ฌ์ฉํ ๋ผ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ์ข ๋ฅ์ ๊ฐ์ฒด์ ๋ํด ์์์ผ ํ๋ ๊ฒ์ด ๋ง์ผ๋ฉด ๋ง์์๋ก ๊ฐํ ์ฐ๊ฒฐ์ด๋ผ ํ๋ค.4. ์ต์ ์ง์ ์๋ฆฌ
- ์ด ์๋ฆฌ์ ๋ฐ์ ํ ๊ด๋ จ์ด ์๋ ์๋ฆฌ๊ฐ ๋ฐ๋ฉํ
๋ฅด ๊ท์น(law of demeter)์ด๋ค. ๋ฐ๋ฉํ
๋ฅด ๊ท์น์ ๋ค์ 4๊ฐ์ง ๊ท์น์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- ๊ท์น 1. ํด๋์ค O์ ์ ์๋์ด ์๋ ๋ฉ์๋m์ ํด๋์ค O์ ์๋ ๋ค๋ฅธ ๋ฉ์๋๋ ํธ์ถํ ์ ์๋ค.
- ๊ท์น 2. ๋ฉ์๋m์ ๊ทธ๊ฒ์ ์ธ์๊ฐ์ฒด์ ๋ฉ์๋๋ ํธ์ถํ ์ ์๋ค.
- ๊ท์น 3. ๋ฉ์๋m ๋ด์์ ์ด๋ค ๊ฐ์ฒด o๋ฅผ ์์ฑํ์์ผ๋ฉด ๊ทธ ๊ฐ์ฒด์ ๋ฉ์๋๋ ํธ์ถํ ์ ์๋ค.
- ๊ท์น 4. ํด๋์ค O์ ์ ์๋์ด ์๋ ๋ฉ์๋ m์ O์ ๋ฉค๋ฒ ๋ณ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ ํธ์ถํ ์ ์๋ค.
class A{
public void foo(){}
}
class B{
public void bar(){}
}
class C{
public void baz(){}
}
class D{
private A a = new A();
public void ham(C c){
B b = new B();
egg(); // rule1
c.baz(); // rule2
b.bar(); // rule3
a.foo(); // rule4
}
public void egg(){}
}
5. ์์ ๊ด๊ณ๋ณด๋ค ํฌํจ ๊ด๊ณ๋ฅผ ์ ํธํด๋ผ
- ์์ ๊ด๊ณ๋ ํด๋์ค ๊ฐ ๊ด๊ณ์ด๋ฉฐ, ์ ์ ๊ด๊ณ์ด๋ค. ์์์ is-a ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ฉฐ, is-a ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๋๋ผ๋ LSP์ ์๋ฐฐ๋์ง ์๋์ง ๊ฒํ ํด์ผ ํ๋ค. ์์์ ์ ์ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๊ด๊ณ๊ฐ ํ์ฑ๋๋ฉด ์ฝ๋ ์์ ์์ด๋ ๊ด๊ณ๋ ์ง์๋๋ค. ์ด ๋๋ฌธ์ ๋ ๊ฐํ ๊ฒฐํฉ์ ํด๋นํ๋ ๊ด๊ณ์ด๋ค. ๋ฐ๋ฉด์ ํฌํจ ๊ด๊ณ๋ ๊ฐ์ฒด ๊ฐ ๊ด๊ณ์ด๋ฉฐ ๋์ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ๋ ์ ์ฐํ๋ค. ์ด๋ ์ค์ํ ๊ฒ์ DIP ์๋ฆฌ์ ๋ฐ๋ผ ๊ตฌ์ฒด์ ์ธ ํ์ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ๊ด๊ณ๋ฅผ ํ์ฑํ๋ฉด ์ ๋๋ค. ํ ๊ฐ์ฒด๋ ์ถ์ ํ์ ์ ๋ณ์๋ interface ๋ณ์๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ ์๊ฐ์ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๊พธ์ด ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค. ์ด ๋๋ฌธ์ ํฌํจ ๊ด๊ณ๋ ๋์จํ ๊ฒฐํฉ์ ํด๋นํ๋ ๊ด๊ณ์ด๋ค.
- ํ์ง๋ง ์ด ์๋ฆฌ์ ๋ฐ๋ผ ์์์ ์ ๋ ์ ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ ์๋ชป๋ ๊ฒ์ด๋ค. ์์์ผ๋ก ๋ชจ๋ธ๋งํด์ผ ํ ๊ฒฝ์ฐ๋ ์๊ณ ์์ ๋์ ์ ํฌํจ ๊ด๊ณ๋ก ๋ชจ๋ธ๋งํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ํนํ, ํฌํจ ๊ด๊ณ๋ง์ ์ฌ์ฉํ๋ฉด ์์์ฒ๋ผ ์ฝ๋ ์ค๋ณต์ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํ์ง ๋ชปํ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐํ๊ณ ์ ์์ฉ์์ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ ์ดํด๋ณด์์ผ ํ๋ฉฐ, ์ด๋ค ๊ด๊ณ๋ฅผ ์ด์ฉํ์ฌ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ธ์ง ์ ์ดํด๋ณด์์ผ ํ๋ค. ํด๋์ค ๊ฐ์ is-a์ ๊ฐ์ ๋ ผ๋ฆฌ์ ๊ด๊ณ๊ฐ ํ์ฑ๋๋์ง, ํด๋์ค ๊ฐ์ ๊ณตํต๋ ํ์๊ฐ ๋ฌด์์ธ์ง. ๊ฐ์ ํ์์ ๋ํ ์ฌ๋ฌ ๊ฐ์ง ๋ค๋ฅธ ๊ตฌํ์ด ํ์ํ ๊ฒ์ธ์ง ๋ฑ์ ๊ฐ๋ฐํ๊ณ ์ ํ๋ ์์ฉ์ ๋ํด ๊ฒํ ํด ๋ณด์์ผ ํ๋ค.6. ํ ๋ฆฌ์ฐ๋ ์์น
- ์์ ์์ค ์์๊ฐ ํ์ ์์ค ์์์ ์์กดํ๊ณ ์ด ํ์ ์์ค ์์๊ฐ ๋ค์ ์์ ์์ค ์์์ ์์กดํ๊ณ , ๊ทธ ์์ ์์ค ์์๊ฐ ๋ ๋ค๋ฅธ ์์์ ์์กดํ๋ ๋ฑ ์์กด ๊ด๊ณ๊ฐ ๋ณต์กํ๊ณ ๊ผฌ์ฌ ์๋ ๊ฒฝ์ฐ์ ์์กด์ฑ ๋ถํจ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋งํ๋ค. ์ด์ฒ๋ผ ์์กด ๊ด๊ณ๊ฐ ๋ณต์กํ๊ฒ ๊ผฌ์ด์ง ์๊ฒ ํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ์ค๊ณ ์์น ์ค ํ๋๊ฐ ํ ๋ฆฌ์ฐ๋ ์์น์ด๋ค. ์ด ์์น์ ์ํ๋ฉด ํ์ ์์ค ์์๋ ์์ ์์ค ์์์ ์ฐ๊ฒฐ๋์ด ๋์ํ ์ ์์ง๋ง ์์ ์์ค ์์๊ฐ ์ธ์ ์ด๋ป๊ฒ ํ์ ์์ค ์์๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ฉฐ, ํ์ ์์ค ์์๋ ์ ๋ ์์ ์์ค ์์๋ฅผ ์ง์ ํธ์ถํ์ง ์์์ผ ํ๋ค.
- ํ ๋ฆฌ์ฐ๋ ์์น์ ์์กด์ฑ ๋ค์ง๊ธฐ ์์น๊ณผ ๋น๊ตํ์ฌ ๋ณด๋ฉด ์์กด์ฑ ๋ค์ง๊ธฐ ์์น์ด ๋ ํฌ๊ด์ ์ธ ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ํ ๋ฆฌ์ฐ๋ ์์น์ ์์ ๊ด๊ณ์ ๊ด๋ จ๋ ์๋ฆฌ์ด์ง๋ง DIP๋ ๊ด๊ณ ์ฃผ์ ๋ฑ ์์, ํฌํจ ๊ด๊ณ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ํตํด ์ ์ฉํ ์ ์๋ ์๋ฆฌ์ด๋ค.