ํ๋ก๊ทธ๋๋จธ๊ฐ ์๊ฐ์ด ์ง๋๋ ์ ์ง ๋ณด์์ ํ์ฅ์ด ์ฌ์ด ์ํํธ์จ์ด๋ฅผ ๋ง๋๋ ๊ฒ์ ์ ์ฉํ๋ 5๊ฐ์ง ์์น
๋จ์ผ ์ฑ ์ ์์น - ์ํํธ์จ์ด ์์(ํด๋์ค, ๋ชจ๋, ํจ์ ๋ฑ)์ ๋จ ํ๋์ ์ฑ ์๋ง์ ๊ฐ์ ธ์ผ ํ๋ค.
ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ์ด์ ๋ ๋จ์ง ์์ง๋ ํ๋์ฌ์ผ๋ง ํ๋ค.
์ฑ ์์ ๋ณ๊ฒฝ์ ์ด์ ๋ค.
- ๋ณ๊ฒฝ์ ์ํด ์์ ์ด ๋๋ ค๋ฉด ๋ง์ ๋ด์ฉ์ด ์์ ๋์ด์ผ ํจ โ ์์ง๋๊ฐ ๋์
- ๋ณ๊ฒฝ์ ์ํ ์ด์ ๊ฐ ๊ฐ์ ๊ฒ๋ค๋ผ๋ฆฌ ๋ชจ์ด์
- ์์ ์ ํ๊ณณ์ ์ง์ค๋์ด์ผ ํจ โ ์ฌ๋ฌ ๊ณณ์ ๊ฑธ์น ์์ ์ด ์์ด๋ฃจ์ด์ง โ ๊ฒฐํฉ๋๊ฐ ๋ฎ์
SRP๋ฅผ ์ ์ฉํ๋ฉด ๊ฐ ํด๋์ค์ ์ฑ ์ ์์ญ์ด ํ์คํด์ง๊ธฐ ๋๋ฌธ์ ํ ์ฑ ์์ ๋ณ๊ฒฝ์์
๋ค๋ฅธ ์ฑ ์์ผ๋ก์ ๋ณ๊ฒฝ์ด ์์ ๋ก์ ์ง ์ ์๊ณ ์ฑ ์์ ์ ์ ํ ๋ถ๋ฐฐํจ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๋ ์ฑ ํฅ์, ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํด์ง๋ค.
์์ ๊ฐ์ ๊ด๊ณ์์ ํ๊ธธ๋ ํด๋์ค๊ฐ ๋๋ฌด ๋ง์ ์ฑ
์์ ์ํํ๊ณ ์์ผ๋ฉฐ
ํน์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํด์ผ ํ๋ฉด ํด๋์ค ์ ์ฒด๋ฅผ ์์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ๋ฐ์ํ๋ค.
์ด์ ๋ํด SRP๋ฅผ ์ ์ฉํ์ฌ ๋ํ๋ด๋ฉด
์ด์ฒ๋ผ ์ฌ๋ฌ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ ๋ํ๋ผ ์ ์๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๋น๊ตํ์ฌ ์ง๊ด์ ์ผ๋ก ๋ณด๋ฉฐ ์ดํดํ๊ธฐ ํธํด์ก์ผ๋ฉฐ ๊ฐ ํด๋์ค์ ์ ์ง ๋ณด์ ์์๋ ํจ์ฌ ๊ฐ๋จํ๊ฒ ํ ์ ์์์ด ๋๊ปด์ง๋ค.
๊ฐ๋ฐฉ-ํ์์ ์์น - ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ธฐ๋ฅ์ ์์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์๋๋ก ์ค๊ณํด์ผ ํ๋ค.
- ํ์ฅ์ ์ด๋ ค์๊ณ ๋ณ๊ฒฝ์ ๋ซํ์๋ค.
- ํ์ฅ์ ํ ๋๋ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ต๋ํ ๊ฑด๋๋ฆฌ์ง ์๊ณ ํ์ฅํ์
- ๋ง์ฝ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ๊ฒ ๋๋ฉด ์ฐ์์ ์ธ ์์ ์ ํ์ง ์์ ์ ์๊ฒ ํ์
- ๊ธฐ์กด ์ฝ๋์ ์์ ์ ๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ์ด ์๊ณ , ๊ทธ๊ฒ์ ํ ์คํธ ํด์ผํ๋ค.
protocol ๋ํ {
var ๋๋ : Double { get }
func ๊ทธ๋ฆฌ๊ธฐ()
}
struct ์ผ๊ฐํ: ๋ํ {
private let ๋ณ: Double
var ๋๋ : Double { ๋ณ * 3 }
func ๊ทธ๋ฆฌ๊ธฐ() {
print("๐บ")
}
}
struct ์ค๊ฐํ: ๋ํ {
private let ๋ณ: Double
var ๋๋ : Double { ๋ณ * 4 }
func ๊ทธ๋ฆฌ๊ธฐ() {
print("๐ง")
}
}
struct ์ค๊ฐํ: ๋ํ {
private let ๋ณ: Double
var ๋๋ : Double { ๋ณ * 5 }
func ๊ทธ๋ฆฌ๊ธฐ() {
print("โฌ")
}
}
์ ์ถ์ํ๋ฅผ ํ์ฉํ ์ฝ๋์์ ๋ํ(protocol)์ ๋์ด ๋ณ์๋ฅผ ์ถ๊ฐํ๋ค๋ฉด ์ด๋ป๊ฒ ๋๋์ง ์๊ฐํด๋ณด์.
var ๋์ด: Double { get }
protocol์๋ ๊ฐ๋ณ๊ฒ ์์ ์ฝ๋ 1์ค๋ง ์์ฑํ๋ฉด ๋์ง๋ง
์ผ๊ฐํ, ์ฌ๊ฐํ, ์ค๊ฐํ ๊ฐ๊ฐ์ ๊ตฌ์กฐ์ฒด์ ๋์ด ๋ณ์๋ฅผ ์ถ๊ฐ/์ฐ์์ ์ธ ์์ ์ ํด์ผ ํ๋ ์ฝ๋์ด๋ค.
๋ค๋ฅธ ์ฝ๋๋ฅผ ์์๋ก ํ์ธํด ๋ณด์
enum ๋ํ {
case ์ผ๊ฐํ(๋ณ: Double)
case ์ฌ๊ฐํ(๋ณ: Double)
case ์ค๊ฐํ(๋ณ: Double)
var ๋๋ : Double {
switch self {
case .์ผ๊ฐํ(let ๋ณ): return ๋ณ * 3
case .์ฌ๊ฐํ(let ๋ณ): return ๋ณ * 4
case .์ค๊ฐํ(let ๋ณ): return ๋ณ * 5
}
}
func ๊ทธ๋ฆฌ๊ธฐ(){
switch self {
case .์ผ๊ฐํ: print("๐บ")
case .์ฌ๊ฐํ: print("๐ง")
case .์ค๊ฐํ: print("โฌ")
}
}
}
์ด๋ ๊ฒ ์์ฑ๋ ์ฝ๋๋ ๋์ด ๋ณ์๋ฅผ ์ถ๊ฐํ ๋, ๋ค๋ฅธ ์ฐ์์ ์ธ ์์ ์ด ํ์ ์์ด
var ๋์ด: Double {
switch self {
case .์ผ๊ฐํ(let ๋ณ): return ๋ณ * ๋ณ / 2
case .์ฌ๊ฐํ(let ๋ณ): return ๋ณ * ๋ณ
case .์ค๊ฐํ(let ๋ณ): return ๋ณ * ๋ณ * sqrt(25 + 10 * sqrt(5))
}
}
์ด ๋ถ๋ถ๋ง ์ถ๊ฐํด์ฃผ๋ฉด ํด๊ฒฐ์ด ๋๋ค.
์ค์ํ ๊ฑด ์ฝ๋์ ์ ๋ต์ ์๋ค
๋ง์ฝ ๋์ด ๋ณ์๋ฅผ ์ถ๊ฐํ๋๊ฒ ์๋ ์ก๊ฐํ์ด๋ผ๋ ๋ํ์ ์ถ๊ฐํด์ผํ๋ ์์ ์ด ์๊ตฌ๋๋ค๋ฉด
์์ ์ถ์ํ๋ฅผ ํ์ฉํ์ฌ Protocol๋ก ์์ฑ๋ ์ฝ๋๋
struct ์ก๊ฐํ: ๋ํ{
private let ๋ณ: Double
var ๋๋ : Double { ๋ณ * 3 }
func ๊ทธ๋ฆฌ๊ธฐ() {
print("โฌข")
}
}
์ด ์ฝ๋๋ง ์ถ๊ฐํ๋ฉด ๋์ง๋ง ์ด๊ฑฐํ(Enum)์ผ๋ก ์์ฑ๋ ์ฝ๋๋ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝ์์ผ์ผํ๋, OCP์์น์ ์งํค์ง ์๋ ์ํฉ์ด ๋๋ค.
๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝ์ํค์ง ์์ผ๋ฉด์ ๊ธฐ๋ฅ์ ์ถ๊ฐ, ํ์ฅํ ์ ์๋๋ก ์ค๊ณํด์ผ ํ๋ค๋ ์๋ฏธ์ด๋ค.
๋ฆฌ์ค์ฝํ ์นํ ์์น - ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค๋ก์จ์ ์ญํ ์ ์๋ฒฝํ ํ ์ ์์ด์ผ ํ๋ค.
- ์๋ธํ์ ์ (์์๋ฐ์) ๊ธฐ๋ณธ ํ์ ์ผ๋ก ๋์ฒด ๊ฐ๋ฅํด์ผ ํ๋ค.
- ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค ๋์(์๋ฏธ)๋ฅผ ๋ฐ๊พธ์ง ์๋๋ค.
๋จ์ํ๊ฒ ํ์ด๋ณด๋ฉด LSP๋ ์ผ๋ฐํ ๊ด๊ณ์ ๋ํ ์ด์ผ๊ธฐ๋ฉฐ ์์ ํด๋์ค๋ ์ต์ํ ์์ ์ ๋ถ๋ชจ ํด๋์ค์์ ๊ฐ๋ฅํ ํ์๋ ์ํํ ์ ์์ด์ผ ํ๋ค๋ ๋ป์ด๋ค.
์ฆ ๊ณ์ธต๋/์กฐ์ง๋์ฒ๋ผ ๊ตฌํ๋ ํ๋ก๊ทธ๋๋ฐ์ ๋ธ์ ์๋ฒ์ง๋ค ์ ๊ฐ์ ๋
ผ๋ฆฌ์ ๋ง์ง ์์์ ์ ์ ์๋ค.
๋ถ๋ฅ๋์ ๊ฒฝ์ฐ ํ์์ ์กด์ฌํ๋ ๊ฒ๋ค์ ์์์ ์๋ ๊ฒ๋ค์ด ์ญํ ์ ํ๋๋ฐ ์ ํ ๋ฌธ์ ๊ฐ ์๋ค.
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น - ํ ํด๋์ค๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค๋ ๊ตฌํํ์ง ๋ง์์ผ ํ๋ค.
ํ๋์ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค๋ณด๋ค๋, ์ฌ๋ฌ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ธํฐํ์ด์ค๊ฐ ๋ซ๋ค.
- ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กด ๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉด ์ ๋๋ค.
์ฆ ์ด๋ค ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ์ข ์ ๋ ๋ ๊ฐ๋ฅํ ์ต์ํ์ ๊ธฐ๋ฅ๋ง์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๋ป์ด๋ค.
ISP๋ ๋น์ทํ ๋ชฉํ๋ฅผ ์ง๋ SRP(๋จ์ผ ์ฑ
์ ์์น)์ ๋น๊ตํ ์ ์๋๋ฐ
SRP์ ๊ฒฝ์ฐ ์ฌ์ฉ์์ ์๊ตฌ์ฌํญ์ด๋ ์ทจํฅ์ ๋ฐ๋ผ ํ๋์ ํด๋์ค๋ฅผ
ํ๋์ ์ฑ
์(์ญํ )๋ง ํํ๋ ๋ค์์ ํด๋์ค๋ก ๋ถํ ํ๋ ๊ฒ์ด๋ผ๋ฉด
ISP์ ๊ฒฝ์ฐ
ํ ํด๋์ค๊ฐ ์ฌ๋ฌ ์ญํ ์ ๊ฐ๋ ๊ฒ์ ์ธ์ ํ์ง๋ง ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ํด๋์ค๊ฐ ์๋
๊ฐ ์ธํฐํ์ด์ค๋ณ๋ก ๋๋์ด ์ฌ์ฉ์์ ํนํ๋ ์ธํฐํ์ด์ค๋ก ์ฑ
์์ ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ฌ์ฉํ์ง ์์ง๋ง ์์กด์ฑ์ ๊ฐ์ง ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๊ณ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ค์๊ฒ๋ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ธฐ๋ฅ์ ๋ํ ์ฌํ๋ฅผ ์ต์ํ ํด์ผํ๋ค.
์์กด ์ญ์ ์์น
- ์์๋ ๋ฒจ ๋ชจ๋์ ํ์๋ ๋ฒจ ๋ชจ๋์ ์์กดํ๋ฉด ์๋๋ค. (๋ ๋ค ์ถ์ํ๋ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ํ๋ค)
- ์ถ์ํ๋ ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๊ณ , ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์ถ์ํ์ ์์กดํด์ผ ํ๋ค.
- ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ตฌ์ฒด(Concrete) ํด๋์ค์ ์์กดํ๋ฉด ์๋๋ค.
์์กด ๊ด๊ณ๋ฅผ ๋งบ์ ๋, ๋ณํํ๊ธฐ ์ฌ์ด๊ฒ ๋ณด๋จ ๋ณํํ๊ธฐ ์ด๋ ค์ด ๊ฒ(๊ฑฐ์ ๋ณํ๊ฐ ์๋ ๊ฒ)์ ์์กดํด์ผ ํ๋ค๋ ์์น์ด๋ค.
DIP ์ ์ฉ ์ ๊ทธ๋ฆผ์์๋ ์๋ฉ,๋ผ๋ผ ๋ฑ ํด๋์ค๋ค์ด ๊ทธ ๋ฌด์์๋ ์์กดํ์ง ์๋ ์ํ์๋๋ฐ
์ ์ฉ ํ ์ปคํผ๋ผ๋ ์ถ์์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์์กดํ๊ฒ ๋๋ค. ์ฆ ์์กด ์ญ์ ์ด ์ผ์ด๋ ๊ฒ์ด๋ค.
๋ํ ์ง์ฅ์ธ๋ ๋ณํํ๊ธฐ ์ฌ์ด ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ๋ ์ํ์์ ์ถ์ํ๋ ๊ฒ์ ์์กดํจ์ผ๋ก์จ
๋ณํ์ ์ํฅ์ ๋ฐ์ง ์๊ฒ ๋ ์์กด ์ญ์ ์ด ๋ฐ์ํ์ฌ ๊ด๊ณ๊ฐ ๋งค์ฐ ํผํผํด์ก๋ค.
DIP ์์กด์ฑ ์ฃผ์ ์ ๊ฒฐ๊ตญ OCP(๊ฐ๋ฐฉํ์์ ์์น)์๋ ์ฐ๊ฒฐ๋์ด ์๋ค.
๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น๋ค์ ๊ฒฐ๊ตญ ์ถ์ํ๋ฅผ ์ด๋ป๊ฒ ์ด์ฉํ์ฌ ์ค๊ณํ ์ง๋ฅผ 5๊ฐ์ง๋ก ๋๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ๋ณผ ์ ์๋ค.