์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋ ๋ค๋ค๋ณผ ์ฃผ์ ๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP) ์์ ๊ผญ ์ง์ผ์ผ ํ๋ ์์น์ธ SOLID ์ ๋๋ค.
SOLID๋ฅผ ์์๋ณด๋ ์ด์ ๋ Swift๋ก ๊ฐ๋ฐ์ ํ๋ฉด์ ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ, ์บก์ํ, ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ ๋ฑ
๋ง์ OOP ๊ฐ๋ ์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
ํ์ง๋ง ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ์ด๋ค ๊ฒ์ด ํจ์จ์ ์ธ์ง ์ด๋ค ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ OOP๋ฅผ ์งํค๋ฉด์ ์ฌ์ฉํ๋ ๊ฒ์ธ์ง๋ ์์ง ๋ชปํ์ฑ
๊ทธ๋ฅ ์ฝ๋ฉ๋ง ํ์์ฃ ... ๊ทธ๋ฌ๋ค๊ฐ ์ฐ์ฐํ
"OOP์์ ๋ฐ๋์ ์ง์ผ์ผ ํ๋ ์์น์ด 5๊ฐ์ง๊ฐ ์๋๋ฐ ๊ทธ๊ฒ์ด SOLID ์์น์ด๋ผ ๋ถ๋ฆฐ๋ค."
๋ผ๋ ๊ฒ์ ๋ฃ๊ณ ์ด๊ฒ ๋ฌด์์ธ์ง ๊ทธ๋ฆฌ๊ณ ์ ์ง์ผ์ผ ํ๋์ง์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ฐ๋ก ์์ ํ ๊ฒ์~
SOLID ์์น์ ๋ฌด์์ผ๊น์?๐ง
์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์์ SOLID๋
๋ก๋ฒํธ ๋งํด์ด 2000๋ ๋ ์ด๋ฐ์ ๋ช ๋ช ํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐ ์ค๊ณ์ ๋ค์ฏ ๊ฐ์ง ๊ธฐ๋ณธ ์์น์
๋ง์ดํด ํ๋์ค๊ฐ ๋๋ฌธ์์ด ๊ธฐ์ต์ ๋ก ์๊ฐํ ๊ฒ์ด๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ ์๊ฐ์ด ์ง๋๋ ์ ์ง ๋ณด์์ ํ์ฅ์ด ์ฌ์ด ์์คํ ์ ๋ง๋ค๊ณ ์ ํ ๋ ์ด ์์น๋ค์ ํจ๊ป ์ ์ฉํ ์ ์๋ค.
SOLID ์์น๋ค์ ์ํํธ์จ์ด ์์ ์์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ค ์ฝ๋๊ฐ ์ฝ๊ธฐ ์ฝ๊ณ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ ๋๊น์ง
์ํํธ์จ์ด ์์ค ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ์ฌ ์ฝ๋ ๋์๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ ์ง์นจ์ด๋ค.
์ด ์์น๋ค์ ์ ์์ผ ์ํํธ์จ์ด ๊ฐ๋ฐ๊ณผ ์ ์์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ ๋ฐ์ ์ ๋ต์ ์ผ๋ถ๋ค. - ์ํค ๋ฐฑ๊ณผ -
์ฆ, ํ๋ง๋๋ก ์ ๋ฆฌํ๋ฉด
"์์ค ์ฝ๋๋ฅผ ์ฝ๊ณ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌํ๋๋ฐ ์ข์ ์ง์นจ์ด๋ค."
๊ทธ๋ ๋ค๋ฉด SOLID ๋ ๋ฌด์์ ์ฝ์์ผ๊น์?๐ค
S
Single Responsibility Principle
๋จ์ผ ์ฑ ์ ์์น
O
Open Closed Principle
๊ฐ๋ฐฉ ํ์ ์์น
L
Liskov Substitution Principle
๋ฆฌ์ค์ฝํ ์นํ ์์น
I
Interface Segregation Principle
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
D
Dependency Inversion Principle
์์กด๊ด๊ณ ์ญ์ ์์น
์ด๋ ๊ฒ 5๊ฐ์ง ์์น์ด ๊ตฌ์ฑ๋์ด ์๊ณ ์ด ์์น๋ค์ ์๊ธ์๋ฅผ ๋ฐ SOLID ์์น์ด๋ผ๊ณ ํฉ๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํ๊ธ๋ก ๋์ด์๋ ๊ฒ๋ ์ดํดํ๊ธฐ๊ฐ ํ๋ค๋๋ผ๊ตฌ์... ์์กด..๊ด๊ณ..์ญ์ ...์์น..?
๊ทธ๋์ ์ ๊ฐ ์ดํดํ ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ํ๋ํ๋ ํ์ดํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
S - O - L - I - D ์์๋ก ์งํํ๊ฒ ์ต๋๋ค~
1. ๊ฐ์์ ์ฑ ์์ ๊ฐ์๊ฐ ์ง์! (SRP) ๐๐ป
์๋์ฒ๋ผ ์ฌ์ฅ๋ ํด๋์ค๊ฐ ์๊ณ ํด์ผํ ์ผ๋ค์ด ์์ต๋๋ค.
๋ง์ฝ ํ ์ฌ์ฅ๋์ด ์ด์ํ๊ณ ๊ธฐํํ๊ณ ๊ฐ๋ฐํ๊ณ ๋์์ธ์ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ฌ์ฅ๋์ด ๋๋ฌด ํ๋ค์ด์ง๊ฒ ์ฃ .....
class ์ฌ์ฅ๋ {
func ์ด์ํ๊ธฐ() {
}
func ๊ธฐํํ๊ธฐ() -> ๊ธฐํ์ {
return ๊ธฐํ์()
}
func ๊ฐ๋ฐํ๊ธฐ() -> ์ดํ๋ฆฌ์ผ์ด์
{
let ๊ธฐํ์ = ๊ธฐํํ๊ธฐ()
let ๋์์ธ = ๋์์ธํ๊ธฐ(๊ธฐํ์:๊ธฐํ์)
let ์ฑ = ์ดํ๋ฆฌ์ผ์ด์
(๊ธฐํ์: ๊ธฐํ์, ๋์์ธ: ๋์์ธ)
return ์ฑ
}
func ๋์์ธํ๊ธฐ(๊ธฐํ์:๊ธฐํ์) -> ๋์์ธ {
return ๋์์ธ()
}
}
๋ง์ฝ ์๋์ ๊ฐ์ด ๊ธฐํํ๋ ๋จ๊ณ์์ ํ๋ซํผ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ธฐํ์๋ฅผ ์ด๋ค๋ฉด
ํ๋ซํผ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ณ๋๋ก ์ถ๊ฐ๊ฐ ๋์ด์ผ ํ ๊ฒ์ ๋๋ค.
์ด๋ ๊ฒ ํ๋์ ๊ธฐ๋ฅ์ด ๋ฐ๋์๋๋ฐ ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ฐ๋์ฌ์ผ ๋๊ณ ์ด๊ฒ์ ์ฌ์ฅ๋ ํ ํด๋์ค๊ฐ ํ๋ค๋ ๊ฒ์ด ๋ฌธ์ ์ ๋๋ค.
func ๊ธฐํํ๊ธฐ(ํ๋ซํผ:ํ๋ซํผ) -> ๊ธฐํ์ {
if ํ๋ซํผ == .ios {
return iOS๊ธฐํ์()
}else if ํ๋ซํผ == .android{
return ์๋๋ก์ด๋๊ธฐํ์()
}else{
return ์น๊ธฐํ์()
}
}
๊ทธ๋ฌ๋๊น ๊ธฐํ์ ๊ธฐํ์๊ฐ ๋์์ธ์ ๋์์ด๋๊ฐ ๊ฐ๋ฐ์ ๊ฐ๋ฐ์๊ฐ ์ด์์ ์ฌ์ฅ๋์ด ํ ์ ์๋๋ก ํ๊ณ
"๊ฐ์์ ์ฑ ์์ ๊ฐ์๊ฐ ์ง๋๊ฑธ๋ก ํ์" ๊ฐ ๋ฐ๋ก ๋จ์ผ ์ฑ ์ ์์น์ด ๋๋๊ฑฐ์ฃ .
class ์ฌ์ฅ๋ {
let ๊ธฐํ์:๊ธฐํ์
let ๊ฐ๋ฐ์:๊ฐ๋ฐ์
let ๋์์ด๋:๋์์ด๋
func ์ด์ํ๊ธฐ() -> ํ๋ฅญํ ์ด์? {
let ๊ธฐํ์ = ๊ธฐํ์.๊ธฐํํ๊ธฐ
let ๋์์ธ = ๋์์ด๋.๋์์ธํ๊ธฐ(๊ธฐํ์:๊ธฐํ์)
let ์ดํ๋ฆฌ์ผ์ด์
= ๊ฐ๋ฐ์.๊ฐ๋ฐํ๊ธฐ(๋์์ธ:๋์์ธ,๊ธฐํ์:๊ธฐํ์)
let ์ด์ = ์ด์(์ฑ:์ดํ๋ฆฌ์ผ์ด์
)
return ์ด์
}
}
class ๊ธฐํ์ {
func ๊ธฐํํ๊ธฐ(ํ๋ซํผ:ํ๋ซํผ) -> ๊ธฐํ์ {
if ํ๋ซํผ == .ios {
return iOS๊ธฐํ์()
}else if ํ๋ซํผ == .android{
return ์๋๋ก์ด๋๊ธฐํ์()
}else{
return ์น๊ธฐํ์()
}
}
}
class ๋์์ด๋ {
func ๋์์ธํ๊ธฐ(๊ธฐํ์:๊ธฐํ์) -> ๋์์ธ {
let ๋์์ธ = ๋์์ธ(๊ธฐํ์:๊ธฐํ์)
return ๋์์ธ
}
}
class ๊ฐ๋ฐ์ {
func ๊ฐ๋ฐํ๊ธฐ(๋์์ธ:๋์์ธ,๊ธฐํ์:๊ธฐํ์) -> ์ดํ๋ฆฌ์ผ์ด์
{
let ์ฑ = ์ดํ๋ฆฌ์ผ์ด์
(๊ธฐํ์: ๊ธฐํ์, ๋์์ธ: ๋์์ธ)
return ์ฑ
}
}
2. ํ์ฅ์ ์ค์ผ์ด. ๊ทผ๋ฐ ์์ ์ ์๋ผ!(OCP) โ
์๋์ฒ๋ผ ๋ง์ฝ ๊ฐ๋ฐ์๊ฐ ์๊ณ ์ด ๊ฐ๋ฐ์๋ iOS์ฑ์ ๋ง๋ค์ ์๋ ๊ฐ๋ฐ์์ ๋๋ค.
struct iOS {
var ํ๋ก์ ํธ์ด๋ฆ:String
}
struct ๊ฐ๋ฐ์ {
func ์ฑ๋ง๋ค๊ธฐ(ํ๋ซํผ:iOS) -> ์ฑ {
ํ๋ก์ ํธ๋ง๋ค๊ธฐ(์ด๋ฆ: ํ๋ซํผ.ํ๋ก์ ํธ์ด๋ฆ)
return ์ฑ()
}
}
func ํ๋ก์ ํธ๋ง๋ค๊ธฐ(์ด๋ฆ:String){
}
struct ์ฑ {
}
์ฌ๊ธฐ์ ์ด ๊ฐ๋ฐ์๊ฐ ์๋๋ก์ด๋๋ฅผ ๊ณต๋ถํด์ ์ฑ์ ๋ง๋๋ ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์๋์ ๊ฐ์ด ๊ฐ๋ฐ์ ๊ตฌ์กฐ์ฒด ์์ ์ฑ๋ง๋ค๊ธฐ ๋ฉ์๋๋ ํ๋ผ๋ฏธํฐ๊ฐ iOS ํ์ ๋ง ํ์ฉ๋์ด์ ์๋๋ก์ด๋๋ฅผ ๋ฃ์ ์๊ฐ ์๊ฒ ๋์ฃ ...
์ด๋ ๊ฒ ๋๋ฉด ๊ฐ ํ๋ซํผ๋ง๋ค ํจ์๊ฐ ์ถ๊ฐ ๋์ด์ผํ ๊ฒ์ด๊ณ ์ด๊ฒ์ ๊ณง ์์ ์ด ๋ง์ด ๋๋ค๋ ๊ฑธ ๋ปํ๊ฒ ๋ฉ๋๋ค.
struct iOS {
var ํ๋ก์ ํธ์ด๋ฆ:String
}
struct ์๋๋ก์ด๋ {
var ํ๋ก์ ํธ์ด๋ฆ:String
}
struct ๊ฐ๋ฐ์ {
func ์ฑ๋ง๋ค๊ธฐ(ํ๋ซํผ:iOS) -> ์ฑ {
ํ๋ก์ ํธ๋ง๋ค๊ธฐ(์ด๋ฆ: ํ๋ซํผ.ํ๋ก์ ํธ์ด๋ฆ)
return ์ฑ()
}
}
func ํ๋ก์ ํธ๋ง๋ค๊ธฐ(์ด๋ฆ:String){
}
struct ์ฑ {
}
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
ํ๋ซํผ์ด๋ผ๋ ํ์ ์ ๋ง๋ค์ด๋ฒ๋ ค์ ๊ฐ๋ฐ์๋ ํ๋ซํผ์ ๋ฐ๋ฅธ ์ฑ์ ๋ง๋ค๊ฒ๋ ํ์
์ด๋ ๊ฒ ๋๋ฉด ์ด๋ค ํ๋ซํผ์ด ์๊ธฐ๋ ํด๋น ํ๋ซํผ๋ง ํ์ฅ์ด ๋๊ณ ๊ฐ๋ฐ์๋ ์์ ํด์ผํ ๋ถ๋ถ์ด ์์ด์ง ๊ฒ์ ๋๋ค.
ํ์ฅ์ ์ธ์ ๋ ์ง ๊ฐ๋ฅํ์ง๋ง ์์ ์ ํ ํ์๊ฐ ์๋ ๊ตฌ์กฐ๊ฐ ๋๊ณ ์ด๊ฒ์ด ๋ฐ๋ก ๊ฐ๋ฐฉ ํ์ ์์น์ด ๋๋ ๊ฒ์ด์ฃ .
protocol ํ๋ซํผ {
func ์ฑ๋ง๋ค๊ธฐ() -> ์ฑ
var ํ๋ก์ ํธ์ด๋ฆ:String { get }
}
struct iOS:ํ๋ซํผ {
func ์ฑ๋ง๋ค๊ธฐ() -> ์ฑ {
return ์ฑ()
}
var ํ๋ก์ ํธ์ด๋ฆ:String
}
struct ์๋๋ก์ด๋:ํ๋ซํผ {
func ์ฑ๋ง๋ค๊ธฐ() -> ์ฑ {
return ์ฑ()
}
var ํ๋ก์ ํธ์ด๋ฆ:String
}
struct ๊ฐ๋ฐ์ {
func ์ฑ๋ง๋ค๊ธฐ(ํ๋ซํผ:ํ๋ซํผ) -> ์ฑ {
ํ๋ก์ ํธ๋ง๋ค๊ธฐ(์ด๋ฆ: ํ๋ซํผ.ํ๋ก์ ํธ์ด๋ฆ)
return ํ๋ซํผ.์ฑ๋ง๋ค๊ธฐ()
}
}
func ํ๋ก์ ํธ๋ง๋ค๊ธฐ(์ด๋ฆ:String){
}
struct ์ฑ {
}
3. ๋ถ๋ชจ๊ฐ ๊ฐ์ง๊ฑด ๋ชจ๋ ์์์๊ฒ ๋ฌธ์ ์์ด์ผ ํด!(LSP) ๐๐ป
์๋์ฒ๋ผ ๋นผ์ผ๋ ๋ฌผ์ด ์ด๋ฏธ ์ ํด์ ธ ์๊ณ ๋ถ๋ชจ๊ฐ ์ง์ฅ๋ผ๋ฉด์ด๊ณ ์์์ด ๋ผ๋ฉด์ธ ๊ฒฝ์ฐ์ ๋๋ค.
์ด๋ ๊ฒ ๋๋ค๋ฉด ๋ผ๋ฉด์ ๋ฌผ์ ๋บ ํ์๊ฐ ์๋๋ฐ ๋ถ๋ชจ๊ฐ ์๋์ผ๋ก ๋จ์ ๋ฌผ์ ๋ฌผ์์ ๋นผ์ผ๋ ๋ฌผ์ ๋นผ๋ฒ๋ ค์
๋ผ๋ฉด๋ ๋จ์ ๋ฌผ์ด 50์ด ๋์ด๋ฒ๋ ธ์ต๋๋ค.... ์ด๋ ๊ฒ ๋๋ฉด ๋ผ๋ฉด์ด ์์ฒญ ์ง๊ฒ ๋ง๋ค์ด์งํ ๋ฐ์.. ์ด๊ฒ์ ์๋ชป๋ ๋ถ๋ชจ์ ๊ฒฝ์ฐ์ ๋๋ค.
var ๋นผ์ผ๋ ๋ฌผ = 450
class ์ง์ฅ๋ผ๋ฉด {
var ๋ฌผ:Int = 500
var ๋จ์๋ฌผ:Int {
return ๋ฌผ - ๋นผ์ผ๋ ๋ฌผ
}
}
class ๋ผ๋ฉด:์ง์ฅ๋ผ๋ฉด{
override var ๋ฌผ:Int {
didSet {
๋ฌผ = 500
}
}
}
func ์๋ฆฌ์์ฑ(์ง์ฅ๋ผ๋ฉด:์ง์ฅ๋ผ๋ฉด) {
print("๋จ์๋ฌผ:\(์ง์ฅ๋ผ๋ฉด.๋จ์๋ฌผ)")
}
let ์งํ๊ฒํฐ = ์ง์ฅ๋ผ๋ฉด()
์๋ฆฌ์์ฑ(์ง์ฅ๋ผ๋ฉด: ์งํ๊ฒํฐ)
let ์ง๋ผ๋ฉด = ๋ผ๋ฉด()
์๋ฆฌ์์ฑ(์ง์ฅ๋ผ๋ฉด: ์ง๋ผ๋ฉด)
์๋์ฒ๋ผ ๋ฉด์๋ฆฌ๋ผ๋ ํ์ ์ ๋ง๋ค์ด์ ๋ฌผ์ ๋นผ์ผํ๋ ์ฌ๋ถ์ ๋จ์ ๋ฌผ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด
์ด๋ค ๋ฉด์๋ฆฌ๋ ์ง ๋ฌธ์ ์์ด ์๋ฆฌ๊ฐ ์์ฑ๋ ์ ์๊ฒ ์ฃ ?
๋ถ๋ชจ๊ฐ ๊ฐ์ง ๊ฒ์ด ์ด๋ค ์์์ด๋ผ๋ ๊ฐ์ก์ ๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ด์ผ ํ๋ค๋ ๊ฒ์ด ๋ฐ๋ก ์ฆ ,๋ฆฌ์ค์ฝํ ์นํ ์์น์ด ๋๋๊ฒ์ ๋๋ค.
var ๋นผ์ผ๋ ๋ฌผ = 450
protocol ๋ฉด์๋ฆฌ {
var ๋ฌผ๋นผ์ผํด:Bool{get}
var ๋จ์๋ฌผ:Int{get}
}
class ์ง์ฅ๋ผ๋ฉด:๋ฉด์๋ฆฌ {
var ๋ฌผ๋นผ์ผํด: Bool
var ๋ฌผ:Int
init(๋ฌผ:Int,๋ฌผ๋นผ:Bool) {
self.๋ฌผ = ๋ฌผ
self.๋ฌผ๋นผ์ผํด = ๋ฌผ๋นผ
}
var ๋จ์๋ฌผ:Int {
if ๋ฌผ๋นผ์ผํด {
return ๋ฌผ - ๋นผ์ผ๋ ๋ฌผ
}
}
}
class ๋ผ๋ฉด:๋ฉด์๋ฆฌ{
var ๋ฌผ๋นผ์ผํด: Bool
var ๋ฌผ:Int
init(๋ฌผ:Int,๋ฌผ๋นผ:Bool) {
self.๋ฌผ = ๋ฌผ
self.๋ฌผ๋นผ์ผํด = ๋ฌผ๋นผ
}
var ๋จ์๋ฌผ:Int {
if ๋ฌผ๋นผ์ผํด {
return ๋ฌผ - ๋นผ์ผ๋ ๋ฌผ
}
}
}
func ์๋ฆฌ์์ฑ(๋ฉด์๋ฆฌ:๋ฉด์๋ฆฌ) {
print("๋จ์๋ฌผ:\(๋ฉด์๋ฆฌ.๋จ์๋ฌผ)")
}
let ์งํ๊ฒํฐ = ์ง์ฅ๋ผ๋ฉด(๋ฌผ: 500, ๋ฌผ๋นผ: true)
์๋ฆฌ์์ฑ(๋ฉด์๋ฆฌ: ์งํ๊ฒํฐ)
let ์ง๋ผ๋ฉด = ๋ผ๋ฉด(๋ฌผ: 500, ๋ฌผ๋นผ: false)
์๋ฆฌ์์ฑ(๋ฉด์๋ฆฌ: ์ง๋ผ๋ฉด)
4. ์ง์ง ํ์ํ ๊ฒ๋ค๋ก ๋ถ๋ฆฌํ์!(ISP)๐ฌ
์ฌ๊ธฐ ์๋ฆฌ๋ผ๋ ํ๋กํ ์ฝ์ด ์๊ณ ๊ธฐ๋ฅ์ ๋ฉด๋ง๋ค๊ธฐ,๋ฐฅ์ง๊ธฐ,์ค์๋ง๋ค๊ธฐ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ง์ฅ๋ฉด,๋น๋น๋ฐฅ,๋ฐ๊ฒํธ ์์์ด ์๋๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๊น๋๋ค...
์ง์ฅ๋ฉด์ ๋ฉด์ถ๊ธฐ๋ง, ๋น๋น๋ฐฅ์ ๋ฐฅ์ง๊ธฐ๋ง , ๋ฐ๊ฒํธ๋ ๋นต๊ตฝ๊ธฐ๋ง ์์ผ๋ฉด ๋๋๋ฐ
์๋ฆฌ ํ๋กํ ์ฝ์ ์ฑํํด ๋ชจ๋ ์๋ฆฌ๊ธฐ๋ฅ์ ๊ฐ ์๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด์ฃ .
protocol ์๋ฆฌ {
func ๋ฉด์ถ๊ธฐ()
func ๋ฐฅ์ง๊ธฐ()
func ๋นต๊ตฝ๊ธฐ()
}
struct ์ง์ฅ๋ฉด:์๋ฆฌ {
func ๋ฉด์ถ๊ธฐ(){}
func ๋ฐฅ์ง๊ธฐ(){}
func ๋นต๊ตฝ๊ธฐ(){}
}
struct ๋น๋น๋ฐฅ:์๋ฆฌ {
func ๋ฉด์ถ๊ธฐ(){}
func ๋ฐฅ์ง๊ธฐ(){}
func ๋นต๊ตฝ๊ธฐ(){}
}
struct ๋ฐ๊ฒํธ:์๋ฆฌ{
func ๋ฉด์ถ๊ธฐ(){}
func ๋ฐฅ์ง๊ธฐ(){}
func ๋นต๊ตฝ๊ธฐ(){}
}
์๋์ ๊ฐ์ด ๊ฐ ๋ฉด,๋ฐฅ,๋นต์ ๋ง๊ฒ ์๋ฆฌ ํ๋กํ ์ฝ์ ๋ง๋ค์ด๋ฒ๋ ค์ ๊ฐ ์๋ฆฌ์ ๋ง๊ฒ ํ๋กํ ์ฝ์ ์ฑํํด์
์ง์ง ํ์ํ ๊ธฐ๋ฅ๋ค๋ง ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ด ๋๋ ๊ฒ์ด์ฃ !
protocol ๋ฉด์๋ฆฌ {
func ๋ฉด์ถ๊ธฐ()
}
protocol ๋ฐฅ์๋ฆฌ {
func ๋ฐฅ์ง๊ธฐ()
}
protocol ๋นต์๋ฆฌ {
func ๋นต๊ตฝ๊ธฐ()
}
struct ์ง์ฅ๋ฉด:๋ฉด์๋ฆฌ {
func ๋ฉด์ถ๊ธฐ(){}
}
struct ๋น๋น๋ฐฅ:๋ฐฅ์๋ฆฌ{
func ๋ฐฅ์ง๊ธฐ(){}
}
struct ๋ฐ๊ฒํธ:๋นต์๋ฆฌ{
func ๋นต๊ตฝ๊ธฐ(){}
}
5. ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ์ง ๋ง์!(DIP) ๐ ๐ผ
์๋์ฒ๋ผ ๋ชฉ๋ง๋ฅธ ์ฌ๋์ด ์๊ณ ๋ชฉ ๋ง๋ฅธ ์ฌ๋์ ์๋ฃ๋ฅผ ๋ง์ ์ผ ํ๋๋ฐ ์๋ฃ๋ ๊ตฌ์ฒด์ ์ธ ์ฝ๋ผ๋ก ๋์ด์์ต๋๋ค.
์ด ๋ ๋ชฉ๋ง๋ฅธ ์ฌ๋์ด ํ์ฐ์ ๋๋ฌด ๋ชฉ์ด ๋ฐ๊ฐ์์ ์ฅฌ์ค๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ชฉ๋ง๋ฅธ ์ฌ๋์๊ฒ ์๋ ์๋ฃ์ ์ข ๋ฅ๋ฅผ ๋ฐ๊ฟ์ค์ผ ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํด์ ์๊ธฐ๋ ๋ฌธ์ ์ ์ธ๋ฐ์.
struct ์ฝ๋ผ {
func ๋ง์๊ธฐ() {}
}
struct ๋ชฉ๋ง๋ฅธ์ฌ๋ {
let ์๋ฃ:์ฝ๋ผ
init(์๋ฃ:์ฝ๋ผ) {
self.์๋ฃ = ์๋ฃ
}
func ๊ฐ์ฆํด์ํ๊ธฐ() {
์๋ฃ.๋ง์๊ธฐ()
}
}
๋ฌธ์ ์ ์ ํด์ํ๊ธฐ ์ํด์ ์๋ฃ๋ผ๋ ์ถ์์ ์ธ ๊ฒ์ด ์๊ณ
๋ชฉ๋ง๋ฅธ ์ฌ๋์ ์ด ์ถ์์ ์ธ ๊ฒ์ ์์กดํ๊ฒ ๋ง๋ค๋ฉด
์๋ฃ๊ฐ ์ด๋ค ๊ฒ์ด ๋๊ฑด ๋ชฉ๋ง๋ฅธ ์ฌ๋์ ์์ ํ ์ผ์ ์์ด์ง ๊ฒ์ ๋๋ค.
๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ์ง ๋ง์ ์ฆ, ์ด๊ฒ์ด ์์กด ๊ด๊ณ ์ญ์ ์์น์ด ๋๋ ๊ฒ์ด์ฃ !
protocol ์๋ฃ {
func ๋ง์๊ธฐ()
}
struct ์ฝ๋ผ:์๋ฃ {
func ๋ง์๊ธฐ() {}
}
struct ์ฅฌ์ค:์๋ฃ {
func ๋ง์๊ธฐ() {}
}
struct ๋ชฉ๋ง๋ฅธ์ฌ๋ {
let ์๋ฃ:์๋ฃ
init(์๋ฃ:์๋ฃ) {
self.์๋ฃ = ์๋ฃ
}
func ๊ฐ์ฆํด์ํ๊ธฐ() {
์๋ฃ.๋ง์๊ธฐ()
}
}
let ์ฝ์นด์ฝ๋ผ = ์ฝ๋ผ()
let ์ค๋ ์ง์ฅฌ์ค = ์ฅฌ์ค()
let foma = ๋ชฉ๋ง๋ฅธ์ฌ๋(์๋ฃ: ์ฝ์นด์ฝ๋ผ)
let gran = ๋ชฉ๋ง๋ฅธ์ฌ๋(์๋ฃ: ์ค๋ ์ง์ฅฌ์ค)
Reference ๐
- ์ค๋์ Swift ์์(๊ฐ์ฒด์ SOLID ์์น)
- SOLID ์์น์ ๋ฐ๋ผ ๊ฐ์ฒด ์ค๊ณํ๊ธฐ
- Swift OOP) SOLID์์น ์๊ฐ
์ด๋ ๊ฒ ์ค๋์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๊ผญ ํ์ํ 5๊ฐ์ง ์์น์ธ SOLID ์์น์ ๋ํด์ ์์๋ณด์๋๋ฐ์.
5๊ฐ์ง ์์น์ผ๋ก ๋๋ ์ ๊ธ์ ์ฐ๋ค๋ณด๋ ๋๋ฌด ๊ธธ์ด์ก๋ค์....
์ ๋ฆฌํ๋ฉด์ ์์น์ ๋ํด์ ๋ค์ ํ๋ฒ ๋ณด๋ ์ ๋ง ๊ผญ ํ์ํ ์์น๋ค์ธ๊ฑฐ ๊ฐ์์!
ํน์๋ผ๋ ํ๋ฆฐ ๋ถ๋ถ์ด ์๊ฑฐ๋ ์ง์ ํ์ค ๋ถ๋ถ์ด ์์ผ๋ฉด ์ธ์ ๋ ๋๊ธ ๋ฌ์์ฃผ์ธ์ ใ ใ
'๐ฅ Computer Science > Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๐ป Programming] Clean Code - ์๋ฏธ์๋ ์ด๋ฆ์ ์จ๋ผ (0) | 2021.06.13 |
---|---|
[๐ป Programming] Clean Code - ๊นจ๋ํ ์ฝ๋๋? (feat.์จ์ผํ๋ ์ด์ ) (0) | 2021.06.13 |
[CS] TDD(Test-Driven-Development)๋? (0) | 2021.06.07 |
[CS] F.I.R.S.T ์์น์ด๋? (feat.UnitTest) (0) | 2021.06.07 |
[CS] ์ผ๊ธ ๊ฐ์ฒด๋? (1) | 2021.05.12 |
๋๊ธ