Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[Swift] FlyWeight Pattern ๋ณธ๋ฌธ

apple/๐Ÿก DesignPattern & Architecture

[Swift] FlyWeight Pattern

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 6. 9. 21:16

FlyWeight Pattern

โœ… FlyWeight Pattern

 

์•„๋ž˜์˜ ๋ฌธ์„œ๋ฅผ ๊ตฌ์ž…ํ•˜์—ฌ ์˜์–ด ๋ฌธ์„œ๋ฅผ ๋ฒˆ์—ญํ•˜๊ณ  ์ดํ•ดํ•œ ๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/18-flyweight-pattern

 

Design Patterns by Tutorials, Chapter 18: Flyweight Pattern

This creational design pattern minimizes memory usage and processing. It also provides objects that all share the same underlying data, thus saving memory. Learn about flyweight objects and static methods to return them.

www.raywenderlich.com

 

FlyWeight ํŒจํ„ด์€ ๋ฉ”๋ชจ๋ฆฌ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์กฐ์  ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

FlyWeight

 

Flyweight ํŒจํ„ด์€ ๋ชจ๋“ ๊ฐ์ฒด๊ฐ€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ํ•˜๊ธฐ์— immutable(๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ)ํ•ฉ๋‹ˆ๋‹ค. 

 

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์—๋Š” flyweights๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐ์ฒด์™€ ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์  ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

 

When should you use it?

 

์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•  ์žฅ์†Œ์—๋Š” ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ตฌ์„ฑ์ด ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ณต์œ  ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์€ ๊ฐœ์ฒด๊ฐ€ ์žˆ๊ณ  ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ฐœ์ฒด๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜๊ณ  ๋Œ€์‹  ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

( * ๊ฐœ์ธ์˜๊ฒฌ: ์‹ฑ๊ธ€ํ†ค๊ณผ ์•„์ฃผ ๋‹ฎ์•˜์ง€๋งŒ, ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด๊ณผ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. )

์žฅ์ : ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Œ.

๋‹จ์ : ๋Ÿฐํƒ€์ž„ ์‹œ ๋งˆ๋‹ค ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋˜‘๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

Playground example

์—ฌ๊ธฐ์„œ๋Š” UIKit์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ํ…Œ์ŠคํŠธ ํ•ด๋ด…์‹œ๋‹ค.

import UIKit

let red = UIColor.red
let red2 = UIColor.red
print(red === red2)

์œ„์˜ ์ฝ”๋“œ์—์„œ print์ด์˜ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฏ€๋กœ ์ฆ‰, UIColor๊ฐ€ ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค. ===๋ฌธ์„ ํ†ตํ•ด์„œ ์ƒ‰์ƒ์„ ๋น„๊ตํ•˜๋ฉด ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, .red๋Š” ํ”Œ๋ผ์ด์›จ์ดํŠธ์ด๋ฉฐ ํ•œ ๋ฒˆ๋งŒ ์ธ์Šคํ„ด์Šคํ™” ๋ฉ๋‹ˆ๋‹ค.

 

let color = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
let color2 = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
print(color === color2)

 

์ด๋ฒˆ์—๋Š” ์ฝ˜์†”์— ๊ฒฐ๊ณผ๊ฐ€ false๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • UI์ƒ‰์ƒ ๊ฐ์ฒด๋Š” ํ”Œ๋ผ์ด์›จ์ดํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋นจ๊ฐ„์ƒ‰, ๋…น์ƒ‰, ํŒŒ๋ž€์ƒ‰์„ ์‚ฌ์šฉํ•˜๊ณ  ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ UI ์ƒ‰์ƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

UIColor๊ฐ€ ๊ฐ’์„ ํ™•์ธํ•˜์—ฌ ์ƒ‰์ƒ์ด ์ด๋ฏธ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ ๊ฒฝ์šฐ ๋Œ€์‹  ํ”Œ๋ผ์ด์›จ์ดํŠธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UIColor extension์„ ํ†ตํ•ด์„œ ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 

extension UIColor {
  
  // 1
  public static var colorStore: [String: UIColor] = [:]
  
  // 2
  public class func rgba(_ red: CGFloat,
                         _ green: CGFloat,
                         _ blue: CGFloat,
                         _ alpha: CGFloat) -> UIColor {
    
    let key = "\(red)\(green)\(blue)\(alpha)"
    if let color = colorStore[key] {
      return color
    }
    
    // 3
    let color = UIColor(red: red,
                        green: green,
                        blue: blue,
                        alpha: alpha)
    colorStore[key] = color
    return color
  }
}

1. ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , RGBA์˜ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

2. UIColor ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋นจ๊ฐ•, ํŒŒ๋ž‘, ์•ŒํŒŒ๋ฅผ key๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. RGB ๊ฐ’์„ ํ‚ค๋ผ๋Š” ๋ฌธ์ž์—ด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ƒ‰์ƒ์ด colorStore์— ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ํ‚ค๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ํ•ด๋‹น ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

3. ํ‚ค๊ฐ€ ์•„์ง colorStore์— ์—†๋Š” ๊ฒฝ์šฐ UI ์ƒ‰์ƒ์„ ์ƒ์„ฑํ•˜๊ณ  ํ‚ค์™€ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

let flyColor = UIColor.rgba(1, 0, 0, 1)
let flyColor2 = UIColor.rgba(1, 0, 0, 1)
print(flyColor === flyColor2)

์ด์ œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

What should you be careful about?

 

ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, ํ”Œ๋ผ์ด์›จ์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ปค์ง€๋Š”์ง€ ์ฃผ์˜ํ•˜์„ธ์š”. ์œ„์˜ colorStore์—์„œ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ์ƒ‰์ƒ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜์ง€๋งŒ, ํ”Œ๋ผ์ด์›จ์ดํŠธ ์Šคํ† ์–ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ๊ฒฝ๊ณ ์— ๋“ฑ๋กํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ผ๋ถ€ ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. LRU ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋˜ํ•œ ํ”Œ๋ผ์ด์›จ์ดํŠธ shared ์ธ์Šคํ„ด์Šค๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. struct๋Š” copyํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ref ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Copying

 

Tutorial Project

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์€ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค. ํ•ด๋‹น ์˜ˆ์ œ๋Š” ์ฐธ๊ณ ์— ๋„ฃ์–ด๋‘์—ˆ๋‹ค.

 

https://github.com/lgvv/DesignPattern/tree/main/flyweight-pattern

 

GitHub - lgvv/DesignPattern: โœจ ๋””์ž์ธ ํŒจํ„ด์„ ๊ณต๋ถ€ํ•ฉ๋‹ˆ๋‹ค!

โœจ ๋””์ž์ธ ํŒจํ„ด์„ ๊ณต๋ถ€ํ•ฉ๋‹ˆ๋‹ค! Contribute to lgvv/DesignPattern development by creating an account on GitHub.

github.com

 

Key points

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

 - ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

 - ์ด ํŒจํ„ด์—๋Š” ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ผ๊ณ  ํ•˜๋Š” ๊ฐ์ฒด์™€ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์  ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋ณ€ํ˜•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 - ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”Œ๋ผ์ด์›จ์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์— ์ฃผ์˜ํ•˜์„ธ์š”. 

 - ํ”Œ๋ผ์ด์›จ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”Œ๋ผ์ด์›จ์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ์— ์ฃผ์˜ํ•˜์„ธ์š”! ์—ฌ๋Ÿฌ ํ”Œ๋ผ์ด์šฐ์—ํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ ํ”Œ๋ผ์ด์›จ์ดํŠธ ์ €์žฅ์†Œ์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฉ”๋ชจ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 - ํ”Œ๋ผ์ดํŠธ์›จ์ดํŠธ์˜ ์˜ˆ๋กœ๋Š” ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์บ์‹ฑํ•˜๊ฑฐ๋‚˜, ๋น ๋ฅธ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ์ฒด ํ’€์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

(์ฐธ๊ณ ) 

https://icksw.tistory.com/247?category=944177 

 

[Swift ๋””์ž์ธ ํŒจํ„ด] Flyweight Pattern (ํ”Œ๋ผ์ด์›จ์ดํŠธ) - ๋””์ž์ธ ํŒจํ„ด ๊ณต๋ถ€ 12

์•ˆ๋…•ํ•˜์„ธ์š” Pingu์ž…๋‹ˆ๋‹ค.๐Ÿง ์ง€๋‚œ ๊ธ€์—์„œ๋Š” ๊ตฌ์กฐ ํŒจํ„ด ์ค‘ Facade Pattern(ํผ์‚ฌ๋“œ)์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋Š”๋ฐ์š”, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ณ„์†ํ•ด์„œ ๊ตฌ์กฐ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ธ Flyweight Pattern(ํ”Œ๋ผ์ด ์›จ์ดํŠธ)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก

icksw.tistory.com

 

'apple > ๐Ÿก DesignPattern & Architecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] Composite Pattern  (1) 2022.06.15
[Swift] Mediator Pattern  (1) 2022.06.15
[Swift] Facade Pattern  (1) 2022.06.07
[Swift] Multicast Delegate Pattern  (0) 2022.06.07
[Swift] State Pattern  (0) 2022.05.30
Comments