[파이썬] 플라이웨이트 패턴과 객체 공유

플라이웨이트 패턴은 객체를 공유하여 메모리를 절약하는 디자인 패턴입니다. 이 패턴은 중복된 객체를 생성하지 않고 이미 생성된 객체를 재사용하여 효율성을 높입니다. 특히, 자주 사용되는 객체를 캐시하여 각각의 요청이 들어올 때마다 객체를 생성하는 대신 캐시된 객체를 반환합니다.

파이썬에서 플라이웨이트 패턴을 구현하기 위해 weakref 모듈을 사용할 수 있습니다. weakref 모듈은 약한 참조를 지원하여 객체가 더 이상 사용되지 않을 때 해당 객체를 자동으로 가비지 컬렉션하게 만듭니다.

다음은 플라이웨이트 패턴을 사용하여 객체를 공유하는 예제 코드입니다. 해당 코드는 웹 서버에서 이미지를 캐시하는 기능을 구현합니다.

import weakref

class Image:
    def __init__(self, filename):
        self.filename = filename
        self.data = None
    
    def load_image(self):
        # 이미지 로드 로직
        # ...

class ImageCache:
    _cache = weakref.WeakValueDictionary()

    @classmethod
    def get_image(cls, filename):
        if filename not in cls._cache:
            image = Image(filename)
            image.load_image()
            cls._cache[filename] = image
        return cls._cache[filename]

# 클라이언트 코드
image1 = ImageCache.get_image('image1.jpg')
image2 = ImageCache.get_image('image1.jpg')

print(image1 is image2)  # True

위의 예제에서 ImageCache 클래스는 이미지 객체를 캐시하는 역할을 합니다. 이미지 객체를 가져올 때 이미 해당 객체가 캐시되어 있는 경우에는 캐시된 객체를 반환하고, 그렇지 않은 경우에는 새로운 이미지 객체를 생성하여 캐시에 저장합니다. 이렇게 함으로써 동일한 이미지 파일을 로드할 때마다 객체를 반복적으로 생성하는 비효율성을 줄일 수 있습니다.

플라이웨이트 패턴은 메모리를 절약하고 객체 생성 비용을 줄이는 등의 성능 향상을 가져올 수 있습니다. 그러나 객체를 공유하는 것이므로 객체의 상태 변경에 유의해야 하며, 필요에 따라 동기화하여 안전한 코드를 작성해야 합니다.