๋๋ SOLID ์์น์ ๋ํด ๋ค์ด๋ณด์ง ๋ชปํ ๊ฐ๋ฐ์๋ค์ ์์ฃผ ๋ง๋ฉ๋๋ค(์ฐ๋ฆฌ๋
์๋ฆผ: ๋ชจ๋ Habr ๋ ์๋ฅผ ์ํ - Habr ํ๋ก๋ชจ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ Skillbox ๊ณผ์ ์ ๋ฑ๋กํ ๋ 10 ๋ฃจ๋ธ ํ ์ธ.
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค. ๊ต์ก์ฉ ์จ๋ผ์ธ ๊ณผ์
"์๋ฐ ๊ฐ๋ฐ์" .
DRY(๋ฐ๋ณตํ์ง ๋ง์ธ์)
๋งค์ฐ ๊ฐ๋จํ ์์น์ผ๋ก, ๊ทธ ๋ณธ์ง์ ์ด๋ฆ์์ ๋ถ๋ช ํฉ๋๋ค. "๋ฐ๋ณตํ์ง ๋ง์ญ์์ค." ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ด๋ ์ค๋ณต ์ฝ๋๋ฅผ ํผํด์ผ ํ ํ์์ฑ๊ณผ ์์ ์์ ์ถ์ํ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ธฐํ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ฝ๋์ ๋ ๊ฐ์ ๋ฐ๋ณต ์น์ ์ด ์๋ ๊ฒฝ์ฐ ํ๋์ ๋ฉ์๋๋ก ๊ฒฐํฉํด์ผ ํฉ๋๋ค. ํ๋์ฝ๋ฉ๋ ๊ฐ์ด ๋ ๋ฒ ์ด์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ณต์ฉ ์์๋ก ๋ณํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ ์ฝ๋๋ฅผ ๋จ์ํํ๊ณ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด ํ์ํ๋ฉฐ, ์ด๊ฒ์ด OOP์ ์ฃผ์ ๋ชฉํ์ ๋๋ค. ๋์ผํ ์ฝ๋๊ฐ OrderId์ SSN ๋ชจ๋์ ๋ํ ํ์ธ์ ํต๊ณผํ์ง ๋ชปํ๋ฏ๋ก ๊ณต์ฉ์ฒด๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
๋ณ๊ฒฝ์ฌํญ ์บก์ํ
๋๋ถ๋ถ์ ํ์ฌ์ ์ํํธ์จ์ด ์ ํ์ ๋์์์ด ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ด๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ง์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์บก์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ธฐ์กด ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ํ
์คํธํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Java๋ก ์์ฑํ๋ค๋ฉด,
๊ฐ๋ฐฉ/ํ์ ์๋ฆฌ
์ด ์์น์ ๋ค์ ๋ฌธ์ฅ์ ์ฝ์ผ๋ฉด ์ฝ๊ฒ ๊ธฐ์ตํ ์ ์์ต๋๋ค. "์ํํธ์จ์ด ์ํฐํฐ(ํด๋์ค, ๋ชจ๋, ๊ธฐ๋ฅ ๋ฑ)๋ ํ์ฅ์ ์ํด ์ด๋ ค์ผ ํ์ง๋ง ์์ ์ ์ํด ๋ซํ ์์ด์ผ ํฉ๋๋ค." ์ค์ ๋ก ์ด๋ ์์ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋์์ ๋ณ๊ฒฝํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์์ค ์ฝ๋ ๋ณ๊ฒฝ์ ์ฝ๋ ์์ , ๋จ์ ํ ์คํธ ๋ฐ ๊ธฐํ ์ ์ฐจ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด ์์น์ด ์ค์ํฉ๋๋ค. ๊ฐ๋ฐฉํ/ํ์ํ ์์น์ ๋ฐ๋ฅด๋ ์ฝ๋๋ ํ์ฅํด๋ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ํจ์ฌ ์ ์ต๋๋ค.
๋ค์์ ์ด ์์น์ ์๋ฐํ๋ ์ฝ๋์ ์์ ๋๋ค.
๊ทธ ์์ ์๋ ๋ด์ฉ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ํ๋ ์กฐ๊ฐ๊ณผ ์ฐ๊ฒฐ๋ ์ฝ๋์ ๋ชจ๋ ์น์
์ ๋ณ๊ฒฝํด์ผ ํ๋ฏ๋ก ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฝ๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ๋ฐฉ-ํ์๋ SOLID์ ์์น ์ค ํ๋์ ๋๋ค.
๋จ์ผ ์ฑ ์ ์์น(SRP)
SOLID ์ธํธ์ ๋ ๋ค๋ฅธ ์๋ฆฌ์ ๋๋ค. โ๊ณ๊ธ์ ๋ณํ๋ฅผ ์ผ์ผํค๋ ์์ธ์ ๋จ ํ๋๋ฟ์ด๋คโ๋ผ๊ณ ๋ช ์๋์ด ์์ต๋๋ค. ์์ ์์๋ ํ ๊ฐ์ง ๋ฌธ์ ๋ง ํด๊ฒฐํฉ๋๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ ์ ์์ง๋ง ๊ฐ ๋ฐฉ๋ฒ์ ๊ณตํต๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ๋ชจ๋ ๋ฉ์๋์ ์์ฑ์ ์ด ๊ธฐ๋ฅ๋ง ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ด ์์น์ ๊ฐ์น๋ ๊ฐ๋ณ ์ํํธ์จ์ด ๊ตฌ์ฑ ์์์ ์ฝ๋ ๊ฐ์ ๊ฒฐํฉ์ ๋์จํ๊ฒ ํ๋ค๋ ๊ฒ์
๋๋ค. ํด๋์ค์ ๋ ์ด์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋ ๊ธฐ๋ฅ ๊ฐ์ ๊ด๊ณ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ทธ ์ค ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฒซ ๋ฒ์งธ์ ์ฐ๊ฒฐ๋ ๋ ๋ฒ์งธ ๊ฒ์ ๋ง์น ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ์๋ณํ๊ธฐ ์ํด ํ
์คํธ ์ฃผ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ข ์์ฑ ๋ฐ์ ์๋ฆฌ(DIP)
์๋ AppManager๊ฐ EventLogWriter์ ์์กดํ๊ณ , EventLogWriter๊ฐ AppManager์ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋๋ ์ฝ๋ ์์ ์
๋๋ค. ํธ์, SMS, ์ด๋ฉ์ผ ๋ฑ ์๋ฆผ์ ํ์ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ ๊ฒฝ์ฐ AppManager ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
DIP๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ AppManager ๋์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ๋ EventLogWriter๋ฅผ ์์ฒญํฉ๋๋ค.
DIP๋ฅผ ์ฌ์ฉํ๋ฉด ์ข ์์ฑ ๋ชจ๋์ ๋ณ๊ฒฝํ์ฌ ๊ฐ๋ณ ๋ชจ๋์ ๋ค๋ฅธ ๋ชจ๋๋ก ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ๋ชจ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํ๋์ ๋ชจ๋์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์์ ๋์ ๊ตฌ์ฑ
์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ์์๊ณผ ํฉ์ฑ์ด๋ผ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ๋ ๋ค ๊ณ ์ ํ ์ฅ์ ๊ณผ ๋จ์ ์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ ์ ์ฐํ๊ธฐ ๋๋ฌธ์ ์ ํธ๋ฉ๋๋ค.
์ปดํฌ์ง์ ์ ์ฌ์ฉํ๋ฉด ํด๋น ์์ฑ์ ์ค์ ํ์ฌ ๋ฐํ์ ์ ํด๋์ค์ ๋์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ ๋ณด๋ค ์ ์ฐํ ๊ตฌํ์ ์ ๊ณตํ๋ ๋คํ์ฑ์ด ์ฌ์ฉ๋ฉ๋๋ค.
Joshua Bloch์ Effective Java์์๋ ์์๋ณด๋ค๋ ๊ตฌ์ฑ์ ์ ํํ๋ผ๊ณ ์กฐ์ธํฉ๋๋ค.
Barbara Liskov ๋์ฒด ์๋ฆฌ(LSP)
SOLID ํดํท์ ๋ ๋ค๋ฅธ ์์น์ ๋๋ค. ์ด๋ ํ์ ์ ํ์ด ์์ ์ ํ์ ๋์ฒดํ ์ ์์ด์ผ ํจ์ ๋ํ๋ ๋๋ค. ์ฆ, ์ํผํด๋์ค์ ํจ๊ป ์๋ํ๋ ๋ฉ์๋์ ํจ์๋ ํ์ํด๋์ค์์๋ ๋ฌธ์ ์์ด ์๋ํ ์ ์์ด์ผ ํฉ๋๋ค.
LSP๋ ๋จ์ผ ์ฑ ์ ์์น๊ณผ ๊ณต์ ์ฑ ์ ์์น ๋ชจ๋์ ์ฐ๊ด๋์ด ์์ต๋๋ค. ํด๋์ค๊ฐ ํ์ ํด๋์ค๋ณด๋ค ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ํ์ ํด๋์ค๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก ์ด ์์น์ ์๋ฐํ๊ฒ ๋ฉ๋๋ค.
๋ค์์ LSP์ ๋ชจ์๋๋ ์ฝ๋์ ๋๋ค.
Area(Rectangle r) ๋ฉ์๋๋ Rectangle์ ๋ฉด์ ์ ๊ณ์ฐํฉ๋๋ค. ์ฌ๊ธฐ์ Square๋ Rectangle์ด ์๋๊ธฐ ๋๋ฌธ์ Square๋ฅผ ์คํํ ํ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ฉ๋๋ค. LSP ์์น์ ๋ฐ๋ฅด๋ฉด ๊ธฐ๋ณธ ํด๋์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ํจ์๋ ์ถ๊ฐ ์ง์นจ ์์ด ํ์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
ํ์ ์ ํ์ ํน์ ์ ์์ธ ์ด ์์น์ "๋ฐ์ดํฐ ์ถ์ํ ๋ฐ ๊ณ์ธต ๊ตฌ์กฐ"๋ผ๋ ์ ๋ชฉ์ 1987๋ ์ปจํผ๋ฐ์ค ๊ธฐ์กฐ์ฐ์ค์์ Barbara Liskov๊ฐ ์ ์ํ ๊ฒ์ ๋๋ค.
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์๋ฆฌ(ISP)
๋ ๋ค๋ฅธ ๊ฒฌ๊ณ ํ ์์น. ์ด์ ๋ฐ๋ฅด๋ฉด ์ฌ์ฉ๋์ง ์๋ ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ฉด ์ ๋๋ค. ์ด ์์น์ ๋ฐ๋ฅด๋ฉด ์ด์ ๋ ผ๋ฆฌ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์์คํ ์ด ์ ์ฐ์ฑ์ ์ ์งํ๊ณ ๋ฆฌํฉํ ๋ง์ ์ ํฉํ๊ฒ ์ ์ง๋๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ฌํ ์ํฉ์ ์ธํฐํ์ด์ค์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ๋์์ ํฌํจ๋์ด ์๊ณ ํด๋ผ์ด์ธํธ์ ๊ทธ ์ค ํ๋๋ง ํ์ํ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ด๋ ค์ด ์์ ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ด ์๋ฃ๋ ํ ์๋ฌด๊ฒ๋ ๊นจ์ง์ง ์๊ณ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
Java์์ ISP ์์น์ ์ฅ์ ์ ๋ชจ๋ ๋ฉ์๋๊ฐ ๋จผ์ ๊ตฌํ๋์ด์ผ ํ๊ณ ๊ทธ ํ์๋ง ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ์๋ฆฌ๋ฅผ ์ด์ฉํ๋ฉด ๋ฐฉ๋ฒ์ ์๋ฅผ ์ค์ด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
๊ตฌํ์ด ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ํ ํ๋ก๊ทธ๋๋ฐ
์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ ์ด๋ฆ์์ ๋ช ํํฉ๋๋ค. ์ด ์์น์ ์ ์ฉํ๋ฉด ์๋ก์ด ์ธํฐํ์ด์ค ๊ตฌํ๊ณผ ํจ๊ป ์๋ํ ์ ์๋ ์ ์ฐํ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
๋ณ์, ๋ฐํ ์ ํ ๋๋ ๋ฉ์๋ ์ธ์ ์ ํ์๋ ์ธํฐํ์ด์ค ์ ํ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด SubClass ๋์ SuperClass๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ฆ :
๋ชฉ๋ก ๋ฒํธ= getNumbers();
๊ทธ๋ฆฌ๊ณ ์๋๋๋ค :
ArrayList ๋ฒํธ = getNumbers();
์์์ ๋ ผ์ํ ๋ด์ฉ์ ์ค์ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ์์น
์ผ๋ฐ์ ์ธ ์๋ Java์ equals() ๋ฐ hashCode() ๋ฉ์๋์ ๋๋ค. ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด ์์ ์ ํด๋ผ์ด์ธํธ ํด๋์ค ๋์ ํด๋น ํด๋์ค์ ์์๋ฉ๋๋ค.
์ด ์์น์ ์ฅ์ ์ ์ฝ๋ ์ค๋ณต์ด ์๊ณ ๋์ ๋ณ๊ฒฝ์ด ๋น๊ต์ ๊ฐ๋จํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฒคํธ ์์์๋ ์ ์ฉ๋ฉ๋๋ค.
์ด๋ฌํ ๋ชจ๋ ์์น์ ํตํด ๋์ ์์ง๋ ฅ๊ณผ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ํตํด ๋์ฑ ์ ์ฐํ๊ณ ์๋ฆ๋ต๊ณ ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ด๋ก ๋ ์ข์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ต๋ํ ์ง์์ ์ค์ ๋ก ํ์ฉํ๋ ค๋ฉด ์ค์ต์ด ํ์ํฉ๋๋ค. OOP ์์น์ ์์งํ๋ค๋ฉด ๋ค์ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋์์ธ ํจํด์ ๋ฐฐ์ฐ๋ ๊ฒ์ผ ์ ์์ต๋๋ค.
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค.
- ์ค๊ธฐ ์ฝ์ค
"๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์ PRO" .- ์จ๋ผ์ธ ๊ฐ์ข ์ ์ฉ
"Python์ ๋ฐ์ดํฐ ๋ถ์๊ฐ" .- XNUMX๋ ์ค์ต ์ฝ์ค
"์ ๋ PRO ์น ๊ฐ๋ฐ์์ ๋๋ค" .
์ถ์ฒ : habr.com