Flyweight Pattern은 대용량 객체를 효율적으로 관리하는 디자인 패턴입니다. 객체지향 프로그래밍에서 객체는 메모리를 사용하는 중요한 요소 중 하나입니다. 특히 대용량 객체의 경우, 메모리 사용량이 매우 크므로 메모리 관리가 중요한 이슈가 됩니다. Flyweight Pattern은 객체를 생성하는 것이 아니라, 객체를 재사용하여 메모리 사용량을 최소화하고 성능을 향상시킵니다. 이번 글에서는 Flyweight Pattern에 대해 알아보겠습니다.

대용량 객체를 효율적으로 관리하는 Flyweight Pattern이란?

Flyweight Pattern은 객체를 재사용하여 메모리 사용량을 최소화하고 성능을 향상시키는 디자인 패턴입니다. 이 패턴에서는 객체를 불필요하게 생성하지 않고, 이미 생성된 객체를 재사용합니다. 이를 위해 객체의 내부 상태와 외부 상태를 분리하고, 내부 상태를 공유합니다. 이는 대용량 객체의 경우, 생성과 소멸에 드는 비용을 줄이고, 메모리 사용량을 최소화하여 성능을 향상시키는 데 도움이 됩니다.

예를 들어, 게임에서 많은 적들을 생성해야 할 경우, 각 적은 비슷한 속성을 가지며, 공통적인 동작을 수행합니다. 이 경우, Flyweight Pattern을 사용하면, 적의 내부 상태를 하나의 객체로 공유하여 메모리 사용량을 최소화할 수 있습니다. 또한, 적의 외부 상태(위치, 방향 등)는 각각 다르지만, 내부 상태를 공유할 수 있기 때문에, 적을 생성할 때 마다 새로운 객체를 생성하지 않아도 됩니다.

어떻게 Flyweight Pattern이 대용량 객체를 효율적으로 관리할 수 있는지 알아보자.

Flyweight Pattern은 다음과 같은 방식으로 대용량 객체를 효율적으로 관리합니다.

  1. 내부 상태와 외부 상태 분리하기: 객체의 내부 상태와 외부 상태를 분리합니다. 내부 상태는 공유할 수 있으며, 외부 상태는 각각 다르게 유지됩니다.

  2. 내부 상태 공유하기: 객체의 내부 상태를 공유합니다. 이를 위해, 객체를 생성할 때 내부 상태를 생성하여 관리합니다. 이후, 다른 객체에서도 내부 상태를 공유하여 사용합니다.

  3. 객체 재사용하기: 이미 생성된 객체를 재사용하여 메모리 사용량을 최소화합니다. 객체를 재사용하기 위해서는, 객체의 풀(pool)을 생성하여 관리합니다. 이 풀에는 객체의 내부 상태를 가지고 있는 객체들이 저장됩니다. 객체를 생성할 경우, 먼저 풀에서 객체를 찾아보고, 없을 경우 생성하여 풀에 저장합니다.

public class FlyweightFactory {
    private Map flyweights = new HashMap();

    public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight();
            flyweights.put(key, flyweight);
            return flyweight;
        }
    }
}

public interface Flyweight {
    void operation();
}

public class ConcreteFlyweight implements Flyweight {
    @Override
    public void operation() {
        // do something
    }
}

위 코드에서 FlyweightFactory는 Flyweight 객체를 생성하고 관리하는 클래스입니다. getFlyweight 메서드를 호출하여 객체를 얻을 수 있습니다. 이 때, flyweights 맵에 이미 존재하는 key를 입력하면, 해당 객체를 반환하고, 존재하지 않는 key를 입력하면, 새로운 객체를 생성하여 반환합니다. ConcreteFlyweight는 Flyweight 인터페이스를 구현한 구체적인 클래스입니다. 내부 상태를 가지고 있으며, operation 메서드를 수행합니다.

Flyweight Pattern은 대용량 객체를 효율적으로 관리하기 위한 디자인 패턴입니다. 객체를 재사용하여 메모리 사용량을 최소화하고 성능을 향상시킬 수 있습니다. 이를 위해 객체의 내부 상태와 외부 상태를 분리하고, 내부 상태를 공유하는 방식을 사용합니다. Flyweight Pattern은 대용량 객체를 다룰 때 매우 유용한 패턴 중 하나입니다.

Reference : Flyweight Pattern: 대용량 객체를 효율적으로 관리하는 디자인 패턴

+ Recent posts