๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ Computer Science/Programming

[Programming] SOLID ์›์น™์ด๋ž€? (feat.iOS ๊ฐœ๋ฐœ์ž)

by Fomagran ๐Ÿ’ป 2021. 3. 4.
728x90
๋ฐ˜์‘ํ˜•

 

 

์•ˆ๋…•ํ•˜์„ธ์š” 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 ์•ฑ {

}

728x90

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 ๐Ÿ˜


 

์ด๋ ‡๊ฒŒ ์˜ค๋Š˜์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์— ๊ผญ ํ•„์š”ํ•œ 5๊ฐ€์ง€ ์›์น™์ธ SOLID ์›์น™์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š”.

 

5๊ฐ€์ง€ ์›์น™์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ธ€์„ ์“ฐ๋‹ค๋ณด๋‹ˆ ๋„ˆ๋ฌด ๊ธธ์–ด์กŒ๋„ค์š”....

 

์ •๋ฆฌํ•˜๋ฉด์„œ ์›์น™์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ณด๋‹ˆ ์ •๋ง ๊ผญ ํ•„์š”ํ•œ ์›์น™๋“ค์ธ๊ฑฐ ๊ฐ™์•„์š”!

 

ํ˜น์‹œ๋ผ๋„ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜ ์ง€์ ํ•˜์‹ค ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“  ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์„ธ์š” ใ…Žใ…Ž

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€