A A
[Design Pattern] Flyweight Pattern - ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด

Flyweight Pattern

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด(Flyweight Pattern)์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ˆ˜์˜ ์ž‘์€ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

  • ์ด ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚ด์  ์ƒํƒœ์™€ ์™ธ์  ์ƒํƒœ๋กœ ๋‚˜๋ˆ„์–ด, ๋‚ด์  ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
Flyweight Pattern → ๋™์ผํ•œ ๊ฒƒ์„ ๊ณต์œ ํ•ด์„œ ๋‚ญ๋น„๋ฅผ ์—†์•ค๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Flyweight๋Š” ํ”Œ๋ผ์ด๊ธ‰ ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ, ๊ถŒํˆฌ์—์„œ ๊ฐ€์žฅ ์ฒด์ค‘์ด ๊ฐ€๋ฒ„์šด ์ฒด๊ธ‰์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • Design Pattern์—์„œ๋Š” Object๋ฅผ ๊ฐ€๋ณ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์˜ ์˜๋ฏธ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Object๋Š” ์ปดํ“จํ„ฐ ๋‚ด๋ถ€์—์„œ ๊ฐ€์ƒ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๊ฒ๋‹ค ๋˜๋Š” ๊ฐ€๋ณ๋‹ค๊ณ  ํ‘œํ˜„์€ ์‹ค์ œ ๋ฌด๊ฒŒ๊ฐ€ ์•„๋‹Œ, “๋ฉ”๋ชจ๋ฆฌ์˜ ์‚ฌ์šฉ๋Ÿ‰”์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ™•๋ณด๋˜๋Š”๋ฐ, ๊ฐ์ฒด๋ฅผ ๋งŽ์ด ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ ๊ฐ์ฒด๊ฐ€ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋‹จ์œ„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž‘์„ ์ˆ˜๋ก ๊ฐ€๋ฒผ์›Œ ์ง‘๋‹ˆ๋‹ค.

“Instance๋ฅผ ๊ฐ€๋Šฅํ•œ ๋Œ€๋กœ ๊ณต์œ ์‹œ์ผœ์„œ ์“ธ๋ฐ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค”

  • ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” instance๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

  • Dog๋Š” name, age, gender, breed, DNA ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Choco, Baduk ๋‘ ๋งˆ๋ฆฌ ๊ฐ•์•„์ง€ Object๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Dog class์˜ repr ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ Choco, Baduk ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ•์•„์ง€ Object๊ฐ€ ์–ด๋А์ •๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ๊ฐ•์•„์ง€๋“ค๊ฐ„์˜ ๊ณตํ†ต์  ์†์„ฑ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋ฉด memory consumption์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Flyweight Pattern์ด๋ž€ ๋‹ค์ˆ˜์˜ Object๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

 

๋ชจ๋“  ๊ฐ•์•„์ง€์˜ DNA๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ

class Dog:
    DNAseq = "ATAGGCCTTACCGATGG...."

    def __init__(self, name, age, gender, breed):
        self.name = name       # <20bytes, upto 20 chars
        self.age = age         # 8 bytes, 64bit integer
        self.gender = gender   # 1 byte
        self.breed = breed     # 2 bytes, upto 65k breeds

    def __repr__(self):
        return f'{self.name},{self.age},{Dog.DNAseq}'
  • DNA ์ •๋ณด๋ฅผ ๋ชจ๋“  ๊ฐ•์•„์ง€๋“ค์ด ๊ณต์œ ํ•œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐ•์•„์ง€๋ฅผ ๋งŒ๋“ค์–ด๋„ DNA ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Dog class attribute๋กœ DNA๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ•์•„์ง€ constructor๋Š” DNA๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ property๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

# Dog ๊ฐ์ฒด ์ƒ์„ฑ
choco = Dog('choco', 2, 'male', 'shihTzu')
baduk = Dog('baduk', 3, 'female', 'jinDo')

# ์ถœ๋ ฅ
print(choco)  # ์ถœ๋ ฅ: choco,2,ATAGGCCTTACCGATGG....
print(baduk)  # ์ถœ๋ ฅ: baduk,3,ATAGGCCTTACCGATGG....
  • ์ด๋ฒˆ์—๋„ choco์™€ baduk ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ์ด์ „๊ณผ ๋™์ผํ•˜์ง€๋งŒ DNA๋ฅผ class attribute๋กœ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ๋Š” DNA๋ฅผ flyweight๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ•์•„์ง€ ์ข…๋งˆ๋‹ค DNA ๋‹ค๋ฅธ ๊ฒฝ์šฐ

์ƒˆ๋กœ์šด ๊ฐ•์•„์ง€ Object๋ฅผ ๋งŒ๋“ค๋”๋ผ๋„ ์‹œ์ธ„๋‚˜ ์ง„๋—๊ฐœ๋ผ๋ฉด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” DNA ์ •๋ณด๋ฅผ ๊ฐ€๋ฆฌํ‚ด์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class DogBreedDNA:
    def __init__(self, breed, DNA):
        self.breed = breed
        self.DNA = DNA

    def __repr__(self):
        return f'{self.DNA}'
  • DogBreedDNA ํด๋ž˜์Šค๋Š” ๊ฐ•์•„์ง€ ์ข…๊ณผ DNA ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

class Dog:
    DNA_Table = {}  # {key: DogBreedDNA}

    @staticmethod
    def addDNA(breed, DNA):
        breed_DNA = DogBreedDNA(breed, DNA)
        Dog.DNA_Table[breed] = breed_DNA

    def __init__(self, name, age, gender, breed):
        self.name = name
        self.age = age
        self.gender = gender
        self.breed = breed
        if breed not in Dog.DNA_Table:
            raise RuntimeError(f"{breed} is not in DNA_Table")

    def __repr__(self):
        return f'{self.name},{self.age},{Dog.DNA_Table[self.breed]}'
  • DNA_Table
    • ํ•ด์‰ฌ๋งต ๊ตฌ์กฐ๋กœ key๊ฐ’์€ ๊ฐ•์•„์ง€ ์ข…(breed), value ๊ฐ’์€ DogBreedDNA object์ž…๋‹ˆ๋‹ค.
    • ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” static method๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • addDNA
    • breed์™€ DNA ์ •๋ณด
    • ์ฆ‰, DogBreedDNA object๋ฅผ DNA_Table์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
  • init
    • Dog object๋ฅผ ์ƒ์„ฑํ•  ๋•Œ breed๊ฐ€ DNA_Table ์•ˆ์— ์—†๋‹ค๋ฉด error๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

# ์ข…์— ๋”ฐ๋ฅธ ์‹œ์ธ„์™€ ์ง„๋—๊ฐœ์˜ DNA ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•จ
Dog.addDNA('shihTzu', 'ATAGGCCTTACCGATGG....')
Dog.addDNA('jinDo', 'ATAGGCCTACCGATGA....')

# Choco์™€ baduk ๊ฐ์ฒด ์ƒ์„ฑ
choco = Dog('choco', 2, 'male', 'shihTzu')
baduk = Dog('baduk', 3, 'female', 'jinDo')

# ์ถœ๋ ฅ
print(choco)  # ์ถœ๋ ฅ: choco,2,ATAGGCCTTACCGATGG....
print(baduk)  # ์ถœ๋ ฅ: baduk,3,ATAGGCCTACCGATGA....
  • ์ข…์— ๋”ฐ๋ฅธ ์‹œ์ธ„์™€ ์ง„๋—๊ฐœ์˜ DNA ์ •๋ณด๋ฅผ Dog class์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • Choco, baduk ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  printํ•ฉ๋‹ˆ๋‹ค.
  • choco, baduk์˜ breed๋Š” ์ด๋ฏธ DNA_Table์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

 

๊ฐœ๋… ํ™•์žฅ

“์—ฌ๋Ÿฌ ์žฅ์†Œ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค”

  • Flyweight Pattern์€ Instance๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ํ…Œ๋งˆ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ์ฃผ์˜ํ•ด์•ผํ•  ๊ฒƒ์€ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์—ฌ๋Ÿฌ ์žฅ์†Œ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ Instance๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ทธ Instance๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ ์žฅ์†Œ์— ๋™์‹œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์žฅ์†Œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ด ํ–ฅ์ƒ ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ํ”„๋กœ๊ทธ๋žจ์ด ์ทจ๊ธ‰ํ•˜๋Š” ๋ฌธ์ œ์— ๋”ฐ๋ผ์„œ ์ข‹์„ ์ˆ˜๋„, ๋‚˜์  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ Flyweight ์—ญํ• ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์ •๋ณด๋Š” ์‹ ์ค‘ํžˆ ์„ ํƒํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Intrinsic vs Extrinsic

  • Intrinsic: ์›๋ž˜ ๊ตฌ๋น„ํ•˜๊ณ  ์žˆ๋Š”, ๋ณธ์งˆ์ ์ธ
  • Intrinsicํ•œ ์ •๋ณด: ์ธ์Šคํ„ด์Šค๋ฅผ ์–ด๋””์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ์–ด๋– ํ•œ ์ƒํ™ฉ์—์„œ๋„ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ •๋ณด, ์ƒํƒœ์— ์˜์กด๋˜์ง€ ์•Š๋Š” ์ •๋ณด์ž…๋‹ˆ๋‹ค.
    • "์žฅ์†Œ๋‚˜ ์ƒํ™ฉ์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค."
  • Extrinsic: ์™ธ๋ถ€์—์„œ์˜จ, ๋น„๋ณธ์งˆ์ ์ธ
  • Extrinsicํ•œ ์ •๋ณด: ๊ณต์œ ์‹œํ‚ค์ง€ ์•Š๋Š” ์ •๋ณด์ด๋ฉฐ, ์ธ์Šคํ„ด์Šค๋ฅผ ๋‘๋Š” ์žฅ์†Œ์— ๋”ฐ๋ผ์„œ ๋ณ€ํ™”ํ•˜๋Š” ์ •๋ณด, ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ์ •๋ณด์ž…๋‹ˆ๋‹ค.
    • "์žฅ์†Œ๋‚˜ ์ƒํ™ฉ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ ํ•  ์ˆ˜ ์—†๋‹ค."