[UMC] ๐Ÿ›’3์ฃผ์ฐจ Design Pattern

Madeline๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปยท2022๋…„ 10์›” 4์ผ
0

๊ฐœ๋ฐœ ์ง€์‹

๋ชฉ๋ก ๋ณด๊ธฐ
6/12
post-custom-banner

1. โญ•Design Patternโญ•

  1. ์ •์˜:

๋””์ž์ธ ํŒจํ„ด(Design Pattern): ๋ฐฉ์‹์„ ํ†ตํ•ด ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์—์„œ ์–ป์€ ์„ธ์„ธํ•œ ๊ฒฝํ—˜๋“ค์„ ๊ธฐ๋กํ•ด ๋†“๋„๋ก ํ•˜๋Š” ๊ฒƒ
-ํŒจํ„ด "์–ด๋–ค ์ƒํ™ฉ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๋ฒ•"

-๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋น„์Šทํ•œ ๋ฌธ์ œ๋“ค์„ ๋งˆ์ฃผํ•˜๋ฉฐ, ์ด ๋ฌธ์ œ๋“ค์€ ํ’€๊ธฐ ์œ„ํ•ด์„œ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. ์ด ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

-๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์œ ํ˜•๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•œ๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ „๋ฌธ๊ฐ€๋“ค์€ ๋””์ž์ธ ํŒจํ„ด์„ ์žฅํ™ฉํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ , ๋””์ž์ธ ํŒจํ„ด ๊ทธ ์ž์ฒด์˜ ์ด๋ฆ„๋งŒ์„ ๋งํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„์˜ ๋ณต์žก๋„๋ฅผ ์ค„์ธ๋‹ค.๋˜ ์˜์‚ฌ์†Œํ†ต์— ํŽธ๋ฆฌํ•จ์„ ์ค€๋‹ค.

  1. ๋””์ž์ธ ํŒจํ„ด ๊ธฐ์ˆ ํ•˜๊ธฐ

1) ํŒจํ„ด ์ด๋ฆ„๊ณผ ๋ถ„๋ฅ˜(Pattern Name and Classification)
ํ•˜๋‚˜์˜ ํŒจํ„ด์— ๋ถ™์€ ์ด๋ฆ„์€ ๊ทธ ์ž์ฒด๊ฐ€ ํ•ต์‹ฌ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ „๋‹ฌํ•ด ์ค€๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค๊ณ„๋ฅผ ํ•  ๋•Œ ์ง์ ‘ ์‚ฌ์šฉํ•  ๋‹จ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์ด๋ฆ„์€ ํŒจํ„ด์˜ ์ƒ๋ช…์ด๋‹ค. ํŒจํ„ด์˜ ๋ถ„๋ฅ˜๋Š” ํŒจํ„ด์˜ ๊ตฌ์„ฑ๋ฐฉ์‹์„ ๋ฐ˜์˜ํ•œ๋‹ค.

2) ์˜๋„(Intent)
์ด ๋””์ž์ธ ํŒจํ„ด์€ ๋ฌด์—‡์„ ํ•˜๋Š” ๊ฐ€? ์˜๋„์™€ ๋…ผ๋ฆฌ์ ์ธ ๊ทผ๊ฑฐ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€? ์–ด๋–ค ํŠน์ •ํ•œ ๋ฌธ์ œ๋‚˜ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ผ๊นŒ์š”? ๋ผ๋Š” ์งˆ๋ฌธ์— ๊ฐ„๊ฒฐํ•œ ๋‹ต์„ ์ œ์‹œํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

3) ๋‹ค๋ฅธ ์ด๋ฆ„(Also Known As)
์ด ํŒจํ„ด์„ ๋‹ค๋ฅด๊ฒŒ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์ œ์‹œ ํ•œ๋‹ค.

4) ๋™๊ธฐ(Motivation)
์„ค๊ณ„ ๋ฌธ์ œ๋ฅผ ์ œ์‹œํ•˜๊ณ , ํŒจํ„ด์•ˆ์—์„œ ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ง€ ์„ค๋ช…ํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํŒจํ„ด์— ๋Œ€ํ•œ ์ข€ ๋” ์ถ”์ƒํ™”๋œ ์„ค๋ช…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€ ์ค€๋‹ค.

5) ํ™œ์šฉ์„ฑ(Applicability)
ํ•ด๋‹น ํŒจํ„ด์„ ์–ด๋–ค ์ƒํ™ฉ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ํŒจํ„ด์ด ๋ฌธ์ œ๋กœ ์‚ผ๋Š” ์ž˜๋ชป๋œ ์„ค๊ณ„์—๋Š” ๋ฌด์—‡์ผ๊นŒ? ์ด ์ƒํ™ฉ์„ ์–ด๋–ป๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

6) ๊ตฌ์กฐ(Structure)
๊ฐ์ฒด ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ•(Object Modeling Technique)1์— ๊ธฐ๋ฐ˜์„ ๋‘” ํ‘œ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ํŒจํ„ด์—์„œ ์“ฐ๋Š” ํด๋ž˜์Šค๋“ค์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค ๋˜ํ•œ ๊ฐ์ฒด ์‚ฌ์ด์— ์˜ค๊ฐ€๋Š” ์š”์ฒญ๊ณผ ํ˜‘๋ ฅ ๊ด€๊ณ„์˜ ์ˆœ์ฐจ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒํ˜ธ์ž‘์šฉ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

7) ์ฐธ์—ฌ์ž(Participant)
์ฃผ์–ด์ง„ ํŒจํ„ด์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด๋“ค์„ ์„ค๋ช…ํ•œ๋‹ค.

8) ํ˜‘๋ ฅ๋ฐฉ๋ฒ•(Collaboration)
์ฐธ์—ฌ์ž๋“ค์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฐธ์—ฌ์ž๋“ค ๊ฐ„์˜ ํ˜‘๋ ฅ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ๋‹ค.

9) ๊ฒฐ๊ณผ(Consequence)
์ด ํŒจํ„ด์ด ์ž์‹ ์˜ ๋ชฉํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ง€์›ํ• ๊นŒ? ์ด ํŒจํ„ด์„ ์ด์šฉํ•œ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ด๊ณ  ์žฅ๋‹จ์ ์€ ๋ฌด์—‡? ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ ๊ตฌ์กฐ์˜ ์–ด๋–ค ๋ฉด์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋‹ค์–‘ํ™” ์‹œํ‚ฌ์ˆ˜ ์žˆ์„๊นŒ?

10) ๊ตฌํ˜„(Implementation)
ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ํ•จ์ •, ํžŒํŠธ, ๊ธฐ๋ฒ•๋“ฑ์€ ๋ฌด์—‡? ํŠน์ • ์–ธ์–ด์— ๊ตญํ•œ๋œ ํŠน์ด์‚ฌํ•ญ์€ ๋ฌด์—‡?

11) ์˜ˆ์ œ์ฝ”๋“œ(Sample Code)
์ฃผ์–ด์ง„ ํŒจํ„ด์„ ์‹ค์ œ๋กœ C++๋‚˜ ์Šค๋ชฐํ† ํฌ๋ฅผ ์ด์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ

12) ์ž˜ ์•Œ๋ ค์ง„ ์‚ฌ์šฉ ์˜ˆ(Known Use)
์‹ค์ œ ์‹œ์Šคํ…œ์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด๋“ค์˜ ์˜ˆ๋กœ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ๋ถ„์•ผ์—์„œ๋Š” ์“ฐ๋Š” ์˜ˆ์ œ๋ฅผ ๋‘ ๊ฐ€์ง€ ์ด์ƒ ํฌํ•จ ์‹œ์ผฐ๋‹ค

13) ๊ด€๋ จ ํŒจํ„ด(Related Pattern)
์ด ํŒจํ„ด๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ํŒจํ„ด๋“ค์€ ๋ฌด์—‡? ์ด๋“ค์˜ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ๋ฌด์—‡? ์–ด๋–ค ๋‹ค๋ฅธ ํŒจํ„ด์— ์ด ํŒจํ„ด์ด ์‚ฌ์šฉ๋˜์–ด ์งˆ๊นŒ?

1. Behavioral Patterns

:๊ฐ์ฒด๊ฐ„์˜ ๊ณตํ†ต๋œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ํŒจํ„ด์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด
-> ์ด ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

-์–ด๋–ค ์ฒ˜๋ฆฌ์˜ ์ฑ…์ž„์„ ์–ด๋Š ๊ฐ์ฒด์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜,
์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์–ด๋–ค ๊ฐ์ฒด์— ์ •์˜ํ•˜๋Š”๊ฒŒ ์ข‹์„์ง€ ์ •ํ•˜๋Š” ํŒจํ„ด!

1. Observer

Observer ํŒจํ„ด์€ ๊ฐ์ฒด๊ฐ€ ์ƒํƒœ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์€ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ์•Œ๊ธฐ ์œ„ํ•ด ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋‹ค.
=> ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋ฐ˜์‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ = ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋žจ
(์ด์ „์—๋Š” ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋žจ)

-์˜ต์ €๋ฒ„ ํŒจํ„ด์€ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋œ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋ฉฐ, ๊ด€์ฐฐํ•œ ๋ณ€ํ™”๋ฅผ ํ•„์š”ํ•œ ๊ณณ์— ์•Œ๋ฆฐ๋‹ค.
-๋ฐœํ–‰์ž(๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ), ๊ตฌ๋…์ž(๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•ด ํ•„์š”ํ•œ ๋™์ž‘ ์ˆ˜ํ–‰)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

var data: String by Delegates.observable(
	initialValue="",
    onChange = { property: KProperty<*>, oldValue: String, newValue: String ->
    println("Data Changed >> from ${oldValue} to ${newValue}")
    }
)

//onChange์˜ ๋žŒ๋‹ค์‹ = ๊ตฌ๋…์ž, data = ๋ฐœํ–‰์ž

2. Strategy

Strategy ํŒจํ„ด์€ ์ž‘์—… ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ต์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“œ๋Š” ๋ฐ์— ์‚ฌ์šฉ๋œ๋‹ค.
-ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค์–‘ํ•˜๋ฉด์„œ ๋ณ€ํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

ex) ์ด๋ฉ”์ผ์„ ๋ณด๋‚ผ ๋•Œ, ์ด๋ฉ”์ผ์—๋Š” ์‹œ์ž‘๋ง๊ณผ ๋งบ์Œ๋ง์ด ๋“ค์–ด๊ฐ€๋ฉฐ, ์‚ฌ๋žŒ๋งˆ๋‹ค ์ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

class MessageConverter(private var messageGenerateStrategy: MessageGenerateStrategy){
	fun convert(string: String): String{
    	return messageGenerateStrategy.process(string)
    }
    //MessageGenerateStrategy์˜ ์ „๋žต์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.
    fun setStrategy(messageGenerateStrategy: MessageGenerateStrategy) {
 	this.messageGenerateStrategy = messageGenerateStrategy
    }
    //MessageGenerateStrategy๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
}
fun main(){
	val message = "Hello"
    val fromIOSStrategy = MessageGenerateStrategy.Etc { message : String -> "${message} : Written from IOS" }
    val messageConverter = MessageConverter(fromIOSStrategy)
    
    println(messageConverter.convert(message))
    //Hello : Written from IOS
    
    val messageHeaderStrategy = MessageGenerateStrategy.AttachHeader("Message : ")
    messageConverter.setStrategt(messageHeaderStrategy)
    
    println(messageConverter.convert(message))
    //Message : Hello

2. Creational Patterns

์ƒ์„ฑ ํŒจํ„ด(creational pattern)์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ ˆ์ฐจ๋ฅผ ์ถ”์ƒํ™”ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ”์ฃผ์— ํ•ด๋‹นํ•˜๋Š” ํŒจํ„ด์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•ฉ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ๊ฐ์ฒด์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ•๊ณผ (์†Œํ”„ํŠธ์›จ์–ด) ์‹œ์Šคํ…œ์„ ๋ถ„๋ฆฌํ•ด ์ค๋‹ˆ๋‹ค.

1) ํด๋ž˜์Šค ์ƒ์„ฑ ํŒจํ„ด - ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค ํด๋ž˜์Šค๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์ƒ์†์„ ์‚ฌ์šฉํ•จ
2) ๊ฐ์ฒด ์ƒ์„ฑ ํŒจํ„ด - ์ธ์Šคํ„ด์Šคํ™” ์ž‘์—…์„ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ๋– ๋„˜๊น€
์ƒ์„ฑ ํŒจํ„ด์˜ ํŠน์ง•

์ƒ์„ฑ ํŒจํ„ด์€ ์‹œ์Šคํ…œ์ด ์–ด๋–ค ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์บก์Šํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ํŒจํ„ด์€ ์ด๋“ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊ณ  ์–ด๋–ป๊ฒŒ ์„œ๋กœ ๋งž๋ถ™๋Š”์ง€์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ์™„์ „ํžˆ ์ˆจ๊น๋‹ˆ๋‹ค. ์ƒ์„ฑ ํŒจํ„ด์„ ์ด์šฉํ•˜๋ฉด ๋ฌด์—‡์ด ์ƒ์„ฑ๋˜๊ณ  ๋ˆ„๊ฐ€ ์ด๊ฒƒ์„ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋Š”์ง€, ์–ธ์ œ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

1. Abstract Factory ์ถ”์ƒ ํŒฉํ† ๋ฆฌ
:์ƒ์„ธํ™”๋œ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋กœ ๊ด€๋ จ์„ฑ์ด ์žˆ๊ฑฐ๋‚˜ ๋…๋ฆฝ์ ์ธ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์˜ ๊ตฐ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

์šฉ๋„:

  • ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ, ํ‘œํ˜„๋˜๋Š” ์ƒ์‹๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‹œ์Šคํ…œ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ

-๊ด€๋ จ๋œ ์ œํ’ˆ ๊ฐ์ฒด๋“ค์ด ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๊ณ , ์ด๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ œ์•ฝ์ด ์™ธ๋ถ€์—๋„ ์ง€์ผœ์ง€๋„๋ก ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

2. Builder
-๋งŽ์€ ๋ณ€์ˆ˜(์ธ์ž)๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋Œ€์‹  ํ•ด์ค€๋‹ค.
-์‚ฌ์šฉ์ž๊ฐ€ ์ด ๊ณผ์ •์—์„œ ์ปค์Šคํ…€ ๊ฐ€๋Šฅํ•˜๋‹ค. (ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.)
-๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค. (๊ฐ ์ธ์ž์˜ ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค)
-ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ธฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

3. Factory Method
-๊ณต์žฅ์ฒ˜๋Ÿผ ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ

Factory Method Pattern vs Abstract Factory Pattern

  • ๊ฐ์ฒด 1๊ฐœ ์ƒ์„ฑ vs ๊ฐ์ฒด ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑ
    ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค!
  • ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๋ฅผ ๊ฒฐ์ • vs ํŒฉํ† ๋ฆฌ์˜ ์ข…๋ฅ˜๋ฅผ ๊ฒฐ์ •
  • ๊ณผ์ •(Process) ์ค‘์‹ฌ vs ์ข…๋ฅ˜(Platform) ์ค‘์‹ฌ

3. Structral Patterns

1. Composite
-์ปดํฌ์ง“ ํŒจํ„ด์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณตํ•ฉ ๊ฐ์ฒด๋‚˜ ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์™€ ๋‚ด์šฉ๋ฌผ์„ ๋™์ผ์‹œ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

=> ์ฆ‰, ์ƒํ•˜๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด.

๋ชจ๋“ ๋ผ์ด๋”๋“ค๋ฐฐ๋‹ฌ()
    ์ •๊ทœ์ง๋ผ์ด๋” ์ •๊ทœ์ง๋ผ์ด๋” = new ์ •๊ทœ์ง๋ผ์ด๋”()
    ํŒŒํŠธํƒ€์ž„๋ผ์ด๋” ํŒŒํŠธํƒ€์ž„๋ผ์ด๋” = new ํŒŒํŠธํƒ€์ž„๋ผ์ด๋”()
    ๋ฐฐ๋ฏผ์ปค๋„ฅํŠธ๋ผ์ด๋” ๋ฐฐ๋ฏผ์ปค๋„ฅํŠธ๋ผ์ด๋” = new ๋ฐฐ๋ฏผ์ปค๋„ฅํŠธ๋ผ์ด๋”()

    ์ •๊ทœ์ง๋ผ์ด๋”.๋ฐฐ๋‹ฌ()
    ํŒŒํŠธํƒ€์ž„๋ผ์ด๋”.๋ฐฐ๋‹ฌ()
    ๋ฐฐ๋ฏผ์ปค๋„ฅํŠธ๋ผ์ด๋”.๋ฐฐ๋‹ฌ()

    ...

=> composite pattern ํ™œ์šฉ

๋ชจ๋“ ๋ผ์ด๋”๋“ค๋ฐฐ๋‹ฌ()
    for (๋ผ์ด๋” : ๋ผ์ด๋”๋ฆฌ์ŠคํŠธ)
        ๋ผ์ด๋”.๋ฐฐ๋‹ฌ()

-๊ฐœ์ˆ˜์™€ ์ƒ๊ด€์—†์ด ์ผ๊ด€์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง„๋‹ค!
-์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•˜๋‹ค.
-๋‹จ, ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ผ๋ฐ˜ํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ๊ฐ์ฒด์— ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค„ ์ˆ˜ ์—†๋‹ค.

=> ๊ฐ์ฒด์˜ ๊ตฌ์„ฑ, ๊ฐœ๋ณ„ ๊ฐ์ฒด ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๋ฌด์‹œํ•  ๋•Œ ์จ์•ผ ํ•œ๋‹ค.
๋””์ž์ธ์„ ์ง€๋‚˜์น˜๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

4. Decorator

  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์ด๋ž€ ์ฃผ์–ด์ง„ ์ƒํ™ฉ ๋ฐ ์šฉ๋„์— ๋”ฐ๋ผ ์–ด๋–ค ๊ฐ์ฒด์— ์ฑ…์ž„์„ ๋ง๋ถ™์ด๋Š” ํŒจํ„ด์œผ๋กœ, ๊ธฐ๋Šฅ ํ™•์žฅ์ด ํ•„์š”ํ•  ๋•Œ ์„œ๋ธŒํด๋ž˜์‹ฑ ๋Œ€์‹  ์“ธ ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
    -๊ฐ™์€ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด ๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ , ๊ฐœ๋ณ„ ๊ฐ์ฒด์— ๋™์ž‘์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๋ฆฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.
    ์ด ๋•Œ, ์•Œ๋ฆผ์„ ์ด๋ฉ”์ผ ์ด์™ธ์— SMS, ํŽ˜์ด์Šค๋ถ ๋“ฑ์œผ๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด,
    Notifier ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๊ณ , ์ถ”๊ฐ€ ์•Œ๋ฆผ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์— ๋„ฃ๋Š”๋‹ค.

    ๊ทธ๋Ÿฐ๋ฐ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์•Œ๋ฆผ์„ ๋™์‹œ์— ์“ฐ๊ณ  ์‹ถ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด!

    ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.
    ํ•˜์ง€๋งŒ ์ƒ์†์€ ์ •์ ์ด๊ธฐ๋•Œ๋ฌธ์—, ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ , ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ƒ์œ„ ํด๋ž˜์Šค๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    => ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ์“ฐ๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ๊ธฐ์กด ๊ฐ์ฒด์— ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์€ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์† ๋Œ€์‹  ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ณต๋ถ€ํ• ์ˆ˜๋ก ๋””์ž์ธ ํŒจํ„ด๋“ค์ด ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์ง€ ์•Š๊ณ ,
์šฉ๋„๋‚˜ ๊ธฐ๋Šฅ์ด ์ค‘์ฒฉ๋˜๋Š” ๋ถ€๋ถ„๋„ ๋งŽ์•„
๊ทธ๋•Œ๊ทธ๋•Œ ํ•„์š”ํ•œ ์šฉ๋„์— ๋”ฐ๋ผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ด๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์ฐธ์กฐ:
https://onlyfor-me-blog.tistory.com/434?category=905380

https://kotlinworld.com/361

profile
๐ŸŽ Apple Developer Academy@POSTECH 2๊ธฐ, ๐Ÿ€ SeSAC iOS 4๊ธฐ
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€