본문 바로가기
Design Pattern

11. 플라이웨이트 패턴 (flyweight pattern)

by 킹차니 2021. 12. 22.

 

 

 

플라이웨이트 패턴

객체를 가볍게 만들어 메모리 사용을 줄이는 패턴

-> 자주 변하는 속성(또는 외적인 속성, extrinsit)과 자주 변하지 않는 속성(또는 내적인 속성, intrinsit)을 분리하고 재사용하여 메모리 사용을 줄일 수 있다.

 

 


 

코드로 알아보기

 

편집기를 만든다고 생각하고 글자들을 관리하기 위해 Character클래스가 필요하다고 해보자.

하나의 글자마자 value, color, fontFamily, fontSize가 부여된다.

이를 사용하는 Client는 아래와 같을 것이다.

 

❗️문제점 ❗️

Client를 보면 value만 다른 Character객체를 5개씩 만들고 있다. Character객체는 분명 상당히 많이 필요할텐데 이렇게 4개의 필드를 가지는 무거운 객체를 계속해서 만드는 것에는 메모리에 낭비가 심하다.

하여 플라이웨이트 패턴을 적용하여 이를 해결해보자.

 

먼저 어떤 Character의 어떤 부분을 자주 변하는(extrinsit)으로 보고 어떤 부분을 자주 변하지 않는 부분(intrinsit)으로 볼 지 정해야한다.

여기서는 value와 color는 extrinsit으로, fontFamily와 fontSize는 intrinsit으로 본다.

 

intrinsit으로 정한 필드들은 클래스를 따로 분리해야한다. 아래와 같이 Font 클래스로 분류하였다.

특히 위의 클래스는 final클래스이고, 그 안의 필드들도 모두 final로 불변하게 설정했다. 이는 외부에서 절대 수정되지 않는다.

 

생성된 Font들을 관리하는 FontFactory는 아래와 같다.

해당 클래스는 이미 생성된 Font라면 그대로 반환하고, 새로운 Font하면 새로 생성하여 저장한다.

 

이제 수정된 Character클래스를 보자

해당 클래스는 fontFamily와 fontSize를 Font클래스로 가지고 있다.

 

이제 Client코드를 보자.

fontFactory.getFont("nanum:12")를 하면 새로운 Font가 아닌 모두 같은 Font객체를 돌려줄 것이다. 이렇게 함으로써 객체의 생성을 가볍게 만들어 메모리 낭비를 줄일 수 있다.

 


 

장점과 단점

 

장점 : 애플리케이션에서 사용하는 메모리를 줄일 수 있다.

단점 : 코드의 복잡도가 증가한다.

 

 

출처: 인프런 백기선님 '코딩으로 학습하는 GoF 강의'
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4