Flyweight Pattern
동일한 것을 공유해서 메모리 낭비 없애기
• Flyweight는 플라이급 이라는 의미로, 권투에서 가장 체중이 가벼운 체급을 의 미함
• 디자인패턴에서는 오브젝트를 가볍게 하기 위한 것의 의미에서 사용
• 오브젝트는 컴퓨터 내부에서 가상적으로 존재하는 것이기 때문에 무겁다 또는 가볍다라고 표현은 실제 무게가 아닌, “메모리의 사용량”을 의미하는 것
• 객체를 만들때 그 객체를 저장하기 위해서 메모리가 확보되는데, 객체를 많이 만 든다고 생각해보면 그 객체가 차지하고 있는 단위 메모리가 작을 수록 가벼워짐
• “인스턴스를 가능한대로 공유시켜서 쓸데없는 메모리를 할당하지 않도록 한다.”
• 이미 만들어져 있는 인스턴스를 이용할 수 있으면 그것을 공유해서 사용
• Dog은 name, age, gender, breed, DNA 속성이 있음
• Choco, Baduk 두 마리 강아지 오브젝트 생성
• Dog class의 __repr__ 함수 이용해서 Choco, Baduk 정보 출력
-> 강아지 한마리의 메모리 크기가 큼
강아지 object가 어느정도 메모리 필요하는지 계산
강아지 name <= 20 bytes
강아지 age <= 2 bytes
강아지 gender <= 10 bytes
강아지 breed <= 10 bytes
강아지 DNA <= 100 MB
⬇️
• 한 마리 당 약 100MB의 메모리 필요
• 두 마리의 강아지를 만들면 200MB 메 모리 필요
• 1000마리의 강아지를 만들면 100GB 이상 필요
• 일반적인 PC에서는 강아지 1000마리 만들기 불가
강아지들간의 공통적 속성을 공유하게 되면
memory consumption을 획기적으로 줄일 수 있음
Flyweight pattern이란 다수의 object를 사용할 때 메모리 사용량을 감소시킴
<모든 강아지의 DNA 같은 경우>
• DNA 정보를 모든 강아지들이 공유한다면 여러 강아지를 만들어도 DNA 정보를 공유하고 있기 때문에
메모리 사용량을 줄일 수 있음
• Dog class attribute로 DNA 넣음
• 강아지 constructor는 DNA를 제외한 다른 property 생성함
• 이번에도 choco와 baduk 오브젝트 생성
• 결과는 이전과 동일하지만 DNA를 class attribute로 사용하였기 때문에 메모리 사용량 감소
• 여기서는 DNA를 flyweight라고 볼 수 있음
<강아지 종마다 DNA 다른 경우>
새로운 강아지 Object를 만들더라도 시츄나 진돗개라면
이미 존재하는 DNA 정보를 가리킴으로써 메모리 사용량을 줄일 수 있음
• DogBreedDNA class는
강아지 종 과 DNA 정보를 저장하는 class
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 class에 추가함
• Choco, baduk 객체를 생성하고 print
• choco, baduk의 breed는 이미 DNA_Table에 있기 때문에 정보 출력됨
• 만약 시바견인 bbobbi 객체를 생성한다면
시바견은 DNA_Table에 없는 breed이기 때문에 생성할 수 없다는 에러 출력됨
Flyweight Pattern은 Object들의 공통된 데이터를 공유함으로써 메모리 사용량을 줄여주는 역할
개념 확장
“여러 장소에 영향을 미친다”
Flyweight패턴은 인스턴스를 공유하는 것이 테마임
가장 주의해야할 것은 공유하고 있는 것을 변경하면 여러 장소에 영향을 미친다는 점
하나의 인스턴스를 변경하면 그 인스턴스를 사용하고 있는 여러 장소에 동시에 영향을 미치 게 됨
여러 장소에 영향을 미치는 것이 항상 나쁜 것은 아니고,
프로그램이 취급하는 문제에 따라서 좋을 수도, 나쁠 수도 있음
따라서, flyweight 역할에게 제공하는 정보는 신중히 선택할 필요가 있음
Intrinsic vs Extrinsic
• Intrinsic: 원래 구비하고 있다. , 본질적인
• Intrinsic한 정보: 인스턴스를 어디에서 가지고 있더라도 어떠한 상황에서도 변하지 않는 정보, 상태에 의존되지 않는 정보
“장소나 상황에 의존하지 않기 때문에 공유할 수 있다.”
• Extrinsic: 외부에서온, 비본질적인
• Extrinsic한 정보: 공유시키지 않는 정보이며, 인스턴스를 두는 장소에 따라서 변화하 는 정보, 상황에 따라 변하는 정보
“장소나 상황에 의존하기 때문에 공유할 수 없다.