๐พ [CS] ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ ๋ฌด์์ผ๊น์?
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object-Oriented Programming, OOP)์ ์์น๊ณผ ๊ฐ๋ ์ ๋ฐํ์ผ๋ก, ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ผ๋ ๋ ๋ฆฝ์ ์ธ ๋จ์๋ก ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๋ค.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑ ์์๋ฅผ ํด๋์ค์ ๊ฐ์ฒด๋ก ๋๋๊ณ , ์ด๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ์ฌ ํจ์จ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ํํธ์จ์ด๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
๐โโ๏ธ ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ ๋ฌด์์ผ๊น์?
1๏ธโฃ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ ๊ฐ๋ .
1๏ธโฃ ๊ฐ์ฒด(Object)
- ๊ฐ์ฒด๋ ๋ฐ์ดํฐ(์์ฑ, ์ํ)์ ์ด ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ๋ฉ์๋(๋์)๊ฐ ๊ฒฐํฉ๋ ๋ ๋ฆฝ์ ์ธ ๋จ์์ ๋๋ค.
- ํ์ค ์ธ๊ณ์ ์ฌ๋ฌผ์ด๋ ๊ฐ๋ ์ ๋ชจ๋ธ๋งํ์ฌ ํ๋ก๊ทธ๋จ ๋ด์์ ์ฌ์ฉํ ์ ์๋ ํํ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์, ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ณ ์ค๊ณํ ์ ์์ต๋๋ค.
2๏ธโฃ ํด๋์ค(Class)
- ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฒญ์ฌ์ง ๋๋ ์ค๊ณ๋์
๋๋ค.
- ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
- ํด๋์ค๋ ๊ฐ์ฒด์ ํน์ฑ(์์ฑ)๊ณผ ํ๋(๋ฉ์๋)์ ์ ์ํ์ฌ, ๊ฐ์ ํํ์ ๊ฐ์ฒด๋ฅผ ๋ค์ ์์ฑํ ์ ์๊ฒ ํฉ๋๋ค.
3๏ธโฃ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)์์๋ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ด๋ฌํ ๊ด๊ณ๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ฉ๋๋ค.
- ์ฐ๊ด ๊ด๊ณ(Association)
- ์งํฉ ๊ด๊ณ(Aggregation)
- ๊ตฌ์ฑ ๊ด๊ณ(Composition)
- ์์ ๊ด๊ณ(Inheritance)
- ์ด๋ฌํ ๊ด๊ณ๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ฉ๋๋ค.
1๏ธโฃ ์ฐ๊ด ๊ด๊ณ(Association)
- ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๊ด๋ จ๋ ๊ด๊ณ์
๋๋ค.
- ์:
ํ์
๊ฐ์ฒด์์์
๊ฐ์ฒด๊ฐ ์๋ก ์ฐ๊ฒฐ๋ ์ ์์.
- ์:
2๏ธโฃ ์งํฉ ๊ด๊ณ(Aggregation)
- ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ผ๋ถ๋ก ํฌํจ๋๋ ๊ด๊ณ์ด์ง๋ง, ๋ถ๋ถ ๊ฐ์ฒด๋ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์์ต๋๋ค.
- ์:
ํ
๊ณผํ์
.
- ์:
3๏ธโฃ ๊ตฌ์ฑ ๊ด๊ณ(Composition)
- ๋ถ๋ถ ๊ฐ์ฒด๊ฐ ์ ์ฒด ๊ฐ์ฒด์ ์์ ํ ์์๋์ด ์์ผ๋ฉฐ, ์ ์ฒด ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋ฉด ๋ถ๋ถ ๊ฐ์ฒด๋ ํจ๊ป ์ฌ๋ผ์ง๋๋ค.
- ์:
์ง
๊ณผ๋ฐฉ
.
- ์:
4๏ธโฃ ์์ ๊ด๊ณ(Inheritance)
- ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ํน์ฑ์ ์์๋ฐ๋ ๊ด๊ณ์
๋๋ค.
- ์:
๋๋ฌผ
ํด๋์ค๊ฐ ์๊ณ , ์ด๋ฅผ ์์๋ฐ์๊ฐ
,๊ณ ์์ด
ํด๋์ค๋ฅผ ์ ์.
- ์:
2๏ธโฃ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ์์น(SOLID)
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)์์๋ SOLID ์์น์ด ์์ฃผ ์ธ๊ธ๋๋ฉฐ, ์ด๋ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ข์ ์ํํธ์จ์ด ์ค๊ณ๋ฅผ ์ํ ์ค์ํ ์ง์นจ์ ๋๋ค.
๐โโ๏ธ SOLID ์์น.
1๏ธโฃ ๋จ์ผ ์ฑ ์ ์์น(Single Responsibility Principle, SRP)
- ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ฉฐ, ๊ทธ ์ฑ ์์ ์๋ฒฝํ๊ฒ ์ํํ๋๋ก ์ค๊ณํด์ผ ํฉ๋๋ค.
- ์ฆ, ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ ์ด์ ๋ ํ๋์ ์ด์ ์ฌ์ผ ํฉ๋๋ค.
- ์:
Order
ํด๋์ค๊ฐ ์ฃผ๋ฌธ ์ฒ๋ฆฌ์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ชจ๋ ์ํํ๋ ๊ฒ์ด ์๋๋ผ, ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง์ ๋ด๋นํ๋Order
ํด๋์ค์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋OrderRespository
ํด๋์ค๋ก ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
2๏ธโฃ ๊ฐ๋ฐฉ-ํ์ ์์น(Open-Closed Principle, OCP)
- ํด๋์ค๋ ํ์ฅ์๋ ์ด๋ ค ์๊ณ , ์์ ์๋ ๋ซํ ์์ด์ผ ํฉ๋๋ค.
- ์ฆ, ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์: ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ํด๋์ค์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์์์ด๋ ์ธํฐํ์ด์ค ๊ตฌํ์ ํตํด ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ด์ผ ํฉ๋๋ค.
3๏ธโฃ ๋ฆฌ์ค์ฝํ ์นํ ์์น(Liskov Substitution Principle, LSP)
- ์๋ธ ํด๋์ค๋ ์ธ์ ๋ ๊ธฐ๋ฐ ํด๋์ค๋ก ๋์ฒดํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์ฆ, ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์์ ํ์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ฉฐ, ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ๋์ํด์ผ ํฉ๋๋ค.
- ์:
Bird
ํด๋์ค์ ํ์ ํด๋์ค์ธPenguin
์ดfly()
๋ฉ์๋๋ฅผ ๊ตฌํํ์ง๋ง, ํ์ค์์๋ ํญ๊ท์ด ๋ ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ์์น์ ์๋ฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ์ค๊ณ๋ฅผ ๋ค์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
4๏ธโฃ ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(Interface Segregation Principle, ISP)
- ๊ตฌํํ์ง ์๋ ๋ฉ์๋๊ฐ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก, ์๊ณ ๊ตฌ์ฒด์ ์ธ ์ธํฐํ์ด์ค๋ก ๋๋์ด์ผ ํฉ๋๋ค.
- ํ๋์ ํฐ ์ธํฐํ์ด์ค๋ณด๋ค๋ ์ฌ๋ฌ ๊ฐ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ์ฌ, ํ์ํ ๊ธฐ๋ฅ๋ง ๊ตฌํํ๋๋ก ํฉ๋๋ค.
- ์:
Printer
์ธํฐํ์ด์ค๊ฐprint()
,scan()
,fax()
๋ฅผ ํฌํจํ๊ณ ์์ ๋, ํ๋ฆฐํฐ๋ง ํ์ํ ๊ฒฝ์ฐ์๋ ์ค์บ๋์ ํฉ์ค ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค๋ฉด,Printable
,Scannable
,Faxable
๊ณผ ๊ฐ์ด ์ธํฐํ์ด์ค๋ฅผ ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
5๏ธโฃ ์์กด ์ญ์ ์์น(Dependency Inversion Principle, DIP)
- ์์ ๋ชจ๋์ ํ์ ๋ชจ๋์ ์์กดํด์๋ ์๋๋ฉฐ, ๋ ๋ค ์ถ์ํ์ ์์กดํด์ผ ํฉ๋๋ค.
- ๊ตฌ์ฒด์ ์ธ ํด๋์ค๊ฐ ์๋, ์ถ์ํ๋ ์ธํฐํ์ด์ค์ ์์กดํ๋๋ก ์ค๊ณํ์ฌ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ์:
Service
ํด๋์ค๊ฐRepository
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , ์ค์ ๋ฐ์ดํฐ ์ ์ฅ ๋ก์ง์FileRepository
๋DatabaseRepository
๊ฐ์ ํด๋์ค์์ ๊ตฌํํ ์ ์๋๋ก ์ค๊ณํฉ๋๋ค.
3๏ธโฃ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ์ฅ์ .
1๏ธโฃ ์ฌ์ฌ์ฉ์ฑ.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)์ ๋ชจ๋์ฑ ๋๋ถ์, ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ค์ํ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๊ฐ๋ฐ ์๊ฐ์ ์ค์ด๊ณ ๋น์ฉ์ ์ ๊ฐํ ์ ์์ต๋๋ค.
2๏ธโฃ ์ ์ง๋ณด์์ฑ.
-
๊ฐ ๊ฐ์ฒด๊ฐ ๋
๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์, ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ํด๋น ๊ฐ์ฒด๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ ์ ์์ด, ์ ์ง๋ณด์๊ฐ ์ฉ์ดํฉ๋๋ค.
3๏ธโฃ ํ์ฅ์ฑ.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ํ์ฅํ ์ ์๋๋ก ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์๋ก์ด ํด๋์ค๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ด, ๋ณํํ๋ ์๊ตฌ ์ฌํญ์ ์ฝ๊ฒ ๋์ํ ์ ์์ต๋๋ค.
4๏ธโฃ ์บก์ํ.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ ์บก์ํ(Encapsulation)๋ฅผ ํตํด ๊ฐ์ฒด ๋ด๋ถ ์ํ๋ฅผ ๋ณดํธํ๊ณ , ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ํํฉ๋๋ค.
- ์ด๋ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ณ , ์ฝ๋์ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๐ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ(Data Integrity)
๋ฐ์ดํฐ๊ฐ ์ ํํ๊ณ ์ผ๊ด๋๋ฉฐ ์ ๋ขฐํ ์ ์๋ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ด๋ ๋ฐ์ดํฐ์ ์ ํ์ฑ, ์ผ๊ด์ฑ, ์ ํจ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ฐ๋ ์ผ๋ก, ๋ฐ์ดํฐ๊ฐ ์ ์ฅ, ์ฒ๋ฆฌ, ์ ์ก๋๋ ๋์ ์์, ๋ณ์กฐ, ์ ์ค ๋ฑ์ด ๋ฐ์ํ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ(Data Integrity)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋น๋กฏํ ๋ค์ํ ์ํํธ์จ์ด ์์คํ ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋ ์ผ๋ก, ๋ฐ์ดํฐ์ ํ์ง์ ์ ์งํ๋ ํต์ฌ ์์์ ๋๋ค.
4๏ธโฃ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ์.
1๏ธโฃ Car
ํด๋์ค ์ค๊ณ ์.
public class Car {
private Engine engine; // ์บก์ํ๋ ์์ง ๊ฐ์ฒด
public Car(Engine engine) { // ์์กด์ฑ ์ฃผ์
this.engine = engine;
}
public void start() {
engine.start();
}
}
- ์ ์ค๊ณ์์๋
Car
ํด๋์ค๊ฐEngine
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง๋ง,Engine
ํด๋์ค์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์์กดํ์ง ์๊ณ ,Engine
์ธํฐํ์ด์ค๋ฅผ ํตํด ๋์ํฉ๋๋ค. - ๋ง์ฝ ์ ๊ธฐ ์์ง์ด๋ ๊ฐ์๋ฆฐ ์์ง์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด,
Engine
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ง ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.- ์ด๋ ์์กด ์ญ์ ์์น(Dependency Inversion Principle, DIP)์ ์ ์ฉํ ์์ ๋๋ค.
5๏ธโฃ ์์ฝ.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ ๊ฐ์ฒด์ ํด๋์ค๋ฅผ ์ค์ฌ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ค๊ณํ์ฌ, ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ ์ํํธ์จ์ด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๊ฐ์ฒด์งํฅ ์ค๊ณ(Object-Oriented Design, OOD)๋ SOLID ์์น์ ํตํด ํจ์จ์ ์ด๊ณ ์ ์ฐํ ์์คํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์บก์ํ, ์์, ๋คํ์ฑ, ์ถ์ํ์ ๊ฐ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ ์ ์ ๊ทน ํ์ฉํฉ๋๋ค.
- ์ด๋ฅผ ํตํ ๋ณต์กํ ์์คํ ์ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ณํํ๋ ์๊ตฌ ์ฌํญ์๋ ์ ์ฐํ๊ฒ ๋์ํ ์ ์์ต๋๋ค.