만들어가는 세상

[JAVA] 플라이웨이트 패턴(Flyweight Pattern) 개념 본문

IT/JAVA

[JAVA] 플라이웨이트 패턴(Flyweight Pattern) 개념

윤재웅 2020. 4. 12. 02:36

플라이웨이트 패턴 개념

플라이웨이트 패턴은 비용이 큰 자원을 공통으로 사용 할 수 있도록 만드는 패턴입니다. 자원에 대한 비용은 크게 두가지로 나눠 볼 수 있습니다.

  1. 중복 생성될 가능성이 높은 경우
    생성될 가능성이 높다는 것은 동일한 자원이 자주 사용될 가능성이 매우 높다는 것을 의미한다. 이런 자원은 공통 자원 형태로 관리해 주는 편이 좋습니다.

  2. 자원 생성 비용은 큰데 사용 빈도가 낮은 경우.
    이런 자원을 항상 미리 생성해 두는 것은 낭비이다. 따라서 요청이 있을 때에 생성해서 제공해 주는 편이 좋습니다.

이 두가지 목적을 위해서 플라이웨이트 패턴은 자원 생성과 제공을 책임진다. 자원의 생성을 담당하는 Factory 역할과 관리 역할을 분리하는 것이 좋을 수 있으나, 일반적으로는 두 역할의 크기가 그리 크지 않아서 하나의 클래스가 담당하도록 구현합니다.

플라이웨이트 패턴 장단점

장점

  • 많은 객체를 만들 때 성능을 향상시킬 수 있다.
  • 많은 객체를 만들 때 메모리를 줄일 수 있다.
  • state pattern과 쉽게 결합될 수 있다.

단점

  • 특정 인스턴스의 공유 컴포넌트를 다르게 행동하게 하는 것이 불가능하다. 공통된 자원이기 때문에 공통된 부분을 싱글톤 처럼 사용하고, 서로 다른 일부 객체는 다르게 사용해야 합니다.

이제 코드로 확인해봅니다.

public class TestPatten1 {
    public static void main(String[] args) {
        MyDataTest md1 = new MyDataTest();
        md1.x = 5;
        md1.y = 11;
        md1.name = "손오공";

        MyDataTest md2 = new MyDataTest();
        md2 = md1;

        MyDataTest md3 = new MyDataTest();
        md3.x = 15;
        md3.y = 21;
        md3.name = "사오정";

        md2.name = "저팔계";
        md2.xpos = 66;
    }
}
class MyDataTest {
    int x;
    int y;
    String name;
}

md1의 객체를 md2에 대입하였습니다. 얇은 복사와 동일합니다. 같은 객체를 사용하는 것 자체가 플라이웨이트 패턴이라 볼수 있습니다. md2의 내용이 바뀌면 같은 객체를 md1을 사용하고 있기 때문에 md1 내용도 바뀌는걸 확인할 수 있습니다. 즉 객체를 재사용 하고 있기 때문에 얕은복사 이면서도 단점이 될수 있지만 이 개념을 알고 로직을 구성한다면, 객체의 불필요한 생성을 줄일 수 있습니다. 같은 객체를 사용함으로써 공통된 로직 사용에는 장점이 될수 있습니다.

이미지로 한번더 이해해 봅니다.

적용 전

적용 후

Comments