⚡플라이웨이트 패턴이란?
플라이웨이트 패턴(Flyweight Pattern)은 객체를 공유하여 메모리를 절약하는 구조적 디자인 패턴이다. 객체 생성 비용이 높은 경우, 객체 생성 시간이 오래 걸리는 경우, 객체가 많이 생성될 가능성이 있는 경우에 사용된다.
플라이웨이트 패턴에서는 객체를 두 가지 종류의 상태로 나눈다. 하나는 내부 상태(internal state)로 외부에서 변경할 수 없으며 다른 하나는 외부 상태(external state)로 외부에서 변경 가능하다. 내부 상태는 객체의 공유 가능한 부분이며 외부 상태는 객체의 개별적인 부분이다.
내부 상태는 객체를 공유하게 되므로 여러 개의 객체를 생성하지 않고 하나의 객체를 공유하여 메모리를 절약할 수 있다. 외부 상태는 객체마다 다르게 유지되어야 하는 정보를 나타내므로 이를 인자로 전달받아 객체의 동작을 다르게 할 수 있다.
플라이웨이트 패턴은 대규모의 객체를 다룰 때 유용하다. 예를 들어 텍스트 에디터에서 글자를 표현하는 객체를 생성할 때 글자 하나마다 객체를 생성하면 메모리가 많이 소비된다. 대신 플라이웨이트 패턴을 적용하여 공유 객체를 사용하면 메모리 사용량을 줄일 수 있다.
플라이웨이트 패턴 구조
- Flyweight 인터페이스: 객체를 공유하는 인터페이스를 정의한다.
- ConcreteFlyweight 클래스: Flyweight 인터페이스를 구현하는 구체적인 클래스이다. 이 클래스는 내부 상태를 가진다.
- Flyweight Factory 클래스: Flyweight 객체를 생성하고 관리한다. 이 클래스는 객체를 캐시하고 공유하여 사용한다.
- Client 클래스: Flyweight 객체를 사용하는 클래스이다. 이 클래스는 외부 상태를 Flyweight 객체에 전달한다.
⚡플라이웨이트 패턴은 어떤 경우에 사용하는가?
- 객체의 개수가 많아 메모리 사용에 부담이 되는 경우
- 객체 생성과 소멸의 오버헤드가 큰 경우
- 객체의 상태를 변화시키지 않는 경우
- 객체를 공유할 수 있는 경우
예를 들어 게임에서 맵의 배경을 그리는데 매번 새로운 이미지 객체를 생성하게 되면 메모리 부족이나 성능 저하 등의 문제가 발생할 수 있다. 이 경우 플라이웨이트 패턴을 사용하여 이미지 객체를 미리 생성하고 재사용함으로써 이러한 문제를 해결할 수 있다.
⚡플라이웨이트 패턴의 장단점
장점
- 메모리를 절약할 수 있다. 객체 생성과 소멸의 비용이 높은 경우 객체를 공유하여 메모리를 절약할 수 있다.
- 성능을 향상시킬 수 있다. 객체 생성과 소멸에 드는 비용이 줄어들기 때문에 프로그램의 성능이 향상될 수 있다.
- 객체를 재사용할 수 있다. 플라이웨이트 패턴을 사용하면 객체를 공유하여 여러 번 재사용할 수 있다.
단점
- 객체를 공유하다 보면 상태가 변경될 수 있다. 객체가 공유되므로 한 객체의 상태가 변경되면 다른 객체도 영향을 받을 수 있다.
- 코드 복잡도가 증가할 수 있다. 플라이웨이트 패턴을 구현하기 위해서는 객체의 공유 여부를 판단하는 로직이 추가되어야 하므로 코드 복잡도가 증가할 수 있다.
플라이웨이트 패턴은 메모리와 성능에 대한 요구사항이 높은 시스템에서 유용하게 사용될 수 있다. 객체 생성과 소멸의 비용이 높은 경우 플라이웨이트 패턴을 사용하여 메모리와 성능을 효율적으로 관리할 수 있다.
⚡플라이웨이트 소스 정리
⚡생각
요즘 계속해서 디자인 패턴에 대해서 정리하고 내부 개발된 내용중 디자인 패턴을 적용시켜서 리팩터링이 가능한 부분이 있는지 보고 있다. 디자인 패턴을 다시 공부하고 정리하면서 느낀 점은 단점이 명확하다는 거다. (코드의 복잡도, 메모리 낭비, 유지보수 시 수정의 복잡성등) 각각의 디자인 패턴마다의 장점은 뚜렷하다고 생각을 하지만 실제 적용을 시키려고 하면 어디서부터 어떻게 적용을 해야 하며 적용을 했을 때의 장점이 많은지 아니면 다른 디자인 패턴을 적용해야 하는 것은 아닌지에 대해서 고민을 하게 된다.
이때 나는 다른 블로그에서 실제 현업에서 적용된 사례 및 실 생활에서 사용 가능한 사례들을 찾아보고 나의 상황에 대입해서 비교하고 장점이 더 많이 부각 되는 경우 사용을 하곤 한다.
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 프록시 패턴에 대한 내용 정리 (0) | 2023.04.10 |
---|---|
[디자인 패턴] 퍼사드 패턴에 대한 내용 정리 (0) | 2023.04.05 |
[디자인 패턴] 데코레이터 패턴에 대한 내용 정리 (0) | 2023.03.28 |
[디자인 패턴] 복합체 패턴에 대한 내용 정리 (0) | 2023.03.26 |
[디자인 패턴] 브리지 패턴에 대한 내용 정리 (0) | 2023.03.25 |