SOLID ์์น
๐ซ Solid
๊ฒฌ๊ณ ํ๊ณ ๋จ๋จํ.
๐ซ The SOLID principles
๊ฒฌ๊ณ ํ๊ณ ๋จ๋จํ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น.
S : Single Responsibility Principle ๋จ์ผ์ฑ ์์์น O : Open-Closed Principle ๊ฐ๋ฐฉ-ํ์์ ์์น L : Liskov Substitution Principle ๋ฆฌ์ค์ฝํ ์นํ ์์น I : Interface Segregation Principle ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น D : Dependency Inversion Principle ์์กด๊ด๊ณ ์ญ์ ์์น
๐ซ S : Single Responsibility Principle | ๋จ์ผ์ฑ ์์์น
๐ซง ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ ์(๋ชฉ์ )๋ง์ ๊ฐ์ง๋ค
Like Unity Component, ๊ฐ ์ปดํฌ๋ํธ๋ ํ๋์ ๊ธฐ๋ฅ๋ง ๊ฐ์ง๋ค.
ํ๋ ์ด์ด์ Audio
, Input
, Movement
๊ธฐ๋ฅ์ Player
๋ผ๋ ํ๋์ ํด๋์ค๋ก ํฉ์ณ์ ๋ง๋ค์ง ์๋๋ค.
PlayerAudio
, PlayerInput
, PlayerMovement
๊ฐ๊ฐ์ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ ๋จ์ผ ์ฑ
์์ ๊ฐ์ง๊ฒ ํ๋ค.
ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด ์ฑ ์๊ณผ ๋ถํฉํ๋ค.
๐ซง ํด๋์ค๋ ๊ทธ ์ฑ ์์ ์์ ํ ์บก์ํํด์ผ ํ๋ค
ํด๋์ค๋ฅผ ์์ ํ๋ ์ด์ ๋ ๋จ ํ๋์ ์ด์ ์ฌ์ผํ๋ค.
ํด๋์ค๋ฅผ ์์ ํ ๋ ๋ค๋ฅธ ํด๋์ค์ ์ํฅ์ ์ฃผ์ง ์๋๋ก, ํด๋์ค์ ์ฑ
์์ ๋ถ๋ฆฌํด์ผํ๋ค.
๐ซง S : Memo
- ํจ์๋ ๋ง์ฐฌ๊ฐ์ง
- ํ๋์ ํจ์๋ ํ๋์ ์ฑ ์(๋ชฉ์ )๋ง์ ๊ฐ์ง๋ค.
- ํด๋์ค ๋น ์ฝ๋ ๊ฐ์
- ํด๋์ค๋ฅผ ๋๋๊ธฐ ๋๋ฌธ์, ํ ํด๋์ค์ ๊ธธ์ด๊ฐ ์งง์์ง๋ค.
- ํด๋์ค ์์กด์ฑ ๊ฐ์
- ํด๋์ค๊ฐ ์์ ๋์ด๋ ๋ค๋ฅธ ํด๋์ค์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
=>
- Readability (๊ฐ๋
์ฑ)
- ์งง์ ํด๋์ค๊ฐ ์ฝ๊ธฐ ์ฝ๋ค.
- Extensibility (ํ์ฅ์ฑ)
- ์์ ํด๋์ค๋ก๋ถํฐ ์์์ด ์ฝ๋ค.
- Reusability (์ฌ์ฌ์ฉ์ฑ)
- ๋ถ๋ถ์์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์๊ณ ๋ชจ๋์์ผ๋ก ์ค๊ณ
- ์ ์ง๋ณด์์ฑ ํฅ์
๐ซ O : Open-Closed Principle | ๊ฐ๋ฐฉ-ํ์์ ์์น
ํด๋์ค ๋ด๋ถ ์์ ์์ด ๋์์ ํ์ฅํ ์ ์์ด์ผ ํ๋ค.
๐ซง ํ์ฅ์๋ ์ด๋ฌ์๊ณ
- ๋ชจ๋์ ๋์์ ํ์ฅํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธ
- ์๊ตฌ ์ฌํญ์ด ๋ณ๊ฒฝ๋ ๋, ์๋ก์ด ๋์์ ์ถ๊ฐํด ๋ชจ๋์ ํ์ฅ
- ์ฆ, ๋ชจ๋์ด ํ๋ ์ผ์ ๋ณ๊ฒฝํ ์ ์์
๐ซง ์์ ์๋ ๋ซํ์์ด์ผํ๋ค
- ์ฝ๋๋ฅผ ์์ ํ์ง ์์๋ ๋ชจ๋์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ๋ชจ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (ex:DLL) ์ ์์ ์ด ํ์ ์์
๐ซง O : Memo
AreaCalculator
์์ ์ผ๊ฐํ
, ์ฌ๊ฐํ
์ ๋์ด๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋๋ฅผ ์ง์ ๋ฃ๊ฒ ๋๋ฉด,
๋์ค์ ์ค๊ฐํ
, ์ก๊ฐํ
์ ์ถ๊ฐํ ๋ AreaCalculator
ํด๋์ค๋ฅผ ์ง์ ์์ ํด์ผํ๋ค.
๋์ CalculateArea()
์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง Shape
์ถ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ,
์ผ๊ฐํ
, ์ฌ๊ฐํ
, ์ค๊ฐํ
๋ฑ์ ํด๋์ค์์ ์ด๋ฅผ ์์๋ฐ์ ๊ตฌํํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด AreaCalculator
ํด๋์ค๋ Shape.CalculateArea()
๋ฅผ ์ด์ฉํด ๋์ด๋ฅผ ๊ณ์ฐํ๋ฏ๋ก,
์๋ก์ด ๋ํ์ด ์ถ๊ฐ๋์ด๋ AreaCalculator
ํด๋์ค๋ฅผ ์ง์ ์์ ํ ํ์๊ฐ ์๋ค.
=> ์ฝ๋๋ฅผ ์ง์ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
๐ซ L : Liskov Substitution Principle | ๋ฆฌ์ค์ฝํ ์นํ ์์น
๐ซง ํ์ ํด๋์ค๋ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค
(ํ์, ์์, ํ์) <-> (๊ธฐ์กด, ๋ถ๋ชจ, ์์)
- ํ์ ํด๋์ค๋ ๊ธฐ์กด ํด๋์ค๋ฅผ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค.
- ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฐฉํฅ์ฑ์ ์ ์งํด์ผ ํ๋ค.
- ์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์๋กํ์ง ์๊ฑฐ๋ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ, ์ด๋ ์์น ์๋ฐ (๋ฐฉํฅ์ฑ์ ๋ฐ๋ฅด์ง ์์ผ๋ฏ๋ก)
๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ ํด๋์ค๋ก ๋ฐ๊ฟ๋ ๋์ผํ๊ฒ ๋์ํด์ผ ํ๋ค.
- ํ์ ํด๋์ค๋ฅผ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ๊ฒ ๋ง๋๋ ์์น
- OOP์ ์์์ ์ฌ์ฉํ๋ฉด ํ์ ํด๋์ค๋ฅผ ํตํด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์
- ๊ทธ๋ฌ๋, ์ฃผ์ํ์ง ์์ผ๋ฉด ๋ถํ์ํ ๋ณต์ก์ฑ์ด ๋ฐ์
๐ซง ์์๋ณด๋ค๋ ๊ตฌ์ฑ
= ์์๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก
= is-a ๋ณด๋ค๋ has-a
- ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ค์ ํ๊ธฐ ์ ์ ํด๋์ค API๋ฅผ ๊ณ ๋ ค
- ํ์ค์ ๋ถ๋ฅ๊ฐ ํญ์ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ณํ๋๋ ๊ฒ์ ์๋
- Ex: Car์ Train์ด ๋ณ๋์ ์์ ํด๋์ค์์ ์์๋ฐ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์
- X :
Vehicle
(GoFoward
,Reverse
,TurnRight
,TurnLeft
) ->Car
,Train
- ๊ธฐ์ฐจ๋ ๊ธธ์ ๋ฐ๋ผ ์์ง์ด๊ธฐ ๋๋ฌธ์
TurnRight
,TurnLeft
๊ฐ ํ์ํ์ง ์์
- ๊ธฐ์ฐจ๋ ๊ธธ์ ๋ฐ๋ผ ์์ง์ด๊ธฐ ๋๋ฌธ์
- O :
IMovable
(GoFoward
,Reverse
),ITurnable
(TurnRight
,TurnLeft
)RoadVehicle
(IMovable
,ITurnable
) ->Car
RailVehicle
(IMovable
) ->Train
- X :
๐ซง L : Memo
์ถ์ํ๋ฅผ ๋จ์ํ๊ฒ ์ ์ง
- ํ์ ํด๋์ค์๋ ๊ธฐ๋ณธ ํด๋์ค์ ํผ๋ธ๋ฆญ ๋ฉค๋ฒ ์กด์ฌ
- ์๋ธํด๋์ฑํ ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ ๋ฆฌ์ค์ฝํ์นํ์์น ์๋ฐฐ
- ๋ถ๋ชจ ํด๋์ค์ ๋ฐฉํฅ์ฑ์ ๋ฐ๋ฅด์ง ์๋ ๊ฒ์ด๋ฏ๋ก
๐ซ I : Interface Segregation Principle | ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
ํฐ ํ๋์ ์ธํฐํ์ด์ค๋ณด๋ค ์ชผ๊ฐ์ง ์์ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๊ฐ ์ข๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ด ์ด์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กดํ์ง ์์์ผ ํ๋ค๋ ์์น
- ํฐ ๋ฉ์ด๋ฆฌ์ ์ธํฐํ์ด์ค๋ค์ ๊ตฌ์ฒด์ ์ด๊ณ ์์ ๋จ์๋ก ๋ถ๋ฆฌ
- ํด๋ผ์ด์ธํธ๋ค์ด ๊ผญ ํ์ํ ๋ฉ์๋๋ค๋ง ์ด์ฉํ ์ ์๊ฒ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค.
- ์์คํ ๋ด๋ถ ์์กด์ฑ์ ์ฝํํ๊ณ ์ ์ฐ์ฑ์ ๊ฐํ
๐ซ D : Dependency Inversion Principle | ์์กด๊ด๊ณ ์ญ์ ์์น
๊ฐ์ฒด ๊ฐ์ ์ํธ์์ฉ์ ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค.
์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋
- ์ํํธ์จ์ด ๋ชจ๋๋ค์ ๋ถ๋ฆฌํ๋ ํน์ ํ์
- ์์(High-level) ๋ชจ๋์ ํ์(Low-level) ๋ชจ๋์ ๊ฒ์ ์ง์ ๊ฐ์ ธ์ค๋ฉด ์๋จ
- ๋ ๋ค ์ถ์ํ์ ์์กดํด์ผ ํจ
- ์ถ์ํ๋ ์ธ๋ถ ์ฌํญ์ ์์กดํด์๋ ์๋จ.
- ์ธ๋ถ ์ฌํญ์ด ์ถ์ํ์ ์์กดํด์ผ ํจ.
- ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ด๊ณ๊ฐ ์์ผ๋ฉด ์๋จ
- ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ์๋ ๋ฐฉ์์ ๋ง์ด ์๊ณ ์์ผ๋ฉด ์๋จ
- ์ข ์์ฑ(dependency) ๋๋ ๊ฒฐํฉ(coupling) ๋ฐ์
- ์ข ์์ฑ์ ์ด๋ ์ ์ฌ์ ์ธ ์ํ
- X :
Switch
๊ฐDoor
,Light
,Fan
์ ๋ชจ๋ ์ง์ ์ ์ด (์์กด)- ๋ค๋ฅธ ๊ธฐ๊ธฐ๊ฐ ์ถ๊ฐ๋๋ฉด
Switch
๋ฅผ ์์ ํด์ผ ํจ
- ๋ค๋ฅธ ๊ธฐ๊ธฐ๊ฐ ์ถ๊ฐ๋๋ฉด
- O :
Swtich
๊ฐISwitchable
์ ์ ์ดDoor
,Light
,Fan
์ ๊ฐ๊ฐISwitchable
์ ๊ตฌํ