티스토리 뷰

플라이웨이트 패턴 (Flyweight pattern)

📝 플라이웨이트(Flyweight) 단어에서 느낄 수 있듯이 가볍다는 의미를 내포하고 있다.
플라이웨이트 패턴은 공유(Sharing)를 통해서 객체를 가볍게 만들어 메모리 사용을 줄여주는 방법을 제공하는 패턴이다.

자주 변하는 속성(extrinsit)과 변하지 않는 속성(intrinsit)을 분리하고 재 사용해 메모리 사용량을 줄일 수 있다.

 

 

객체모델

 

 

Flyweight
/**
 * Flyweight 객체는 캐싱되어야 하고 공유되어야 하기 때문에 불변해야 한다. <- Kotlin의 Data Class
 * 조건 1 : 불변 상태
 * 조건 2 : 상속 X
 */
public record Flyweight(String name) {}
  • record 는 자바 16 이후 사용가능
  • record는 상속 불가, hash(), equals() 구현을 해두었으며, 불변 객체.
  • 플라이웨이트 패턴은 변하지 않는 값을 풀에 캐싱해서 재사용하기 때문에 불변 객체여야 만 함.

 

FlyweightFactory
public class FlyweightFactory {
  private Map<String, Flyweight> cache = new HashMap<>();

  public Flyweight getCache(String name) {
    if (cache.containsKey(name)) {
      return cache.get(name);
    } else {
      Flyweight cachedObject = new Flyweight(name);
      cache.put(name, cachedObject);
      return cachedObject;
    }
  }
}

 

Client
public class Client {
  static FlyweightFactory factory = new FlyweightFactory();

  public static void main(String[] args) {
    Flyweight hero = factory.getCache("Hero");
    System.out.println(hero.name() + " -> hero1 hash : " + hero.hashCode());

    Flyweight hero2 = factory.getCache("Hero");
    System.out.println(hero2.name() + " -> hero2 hash : " + hero2.hashCode());

    System.out.println("hero equals hero2 -> " + (hero.equals(hero2)));
  }
}

 

 

결과

  • 두 객체가 서로 같다는 것을 통해 재사용하고 있음을 확인 할 수 있다.

👍 장점

  • 자주 사용하는 객체를 캐싱 후 재사용 하기 때문에 사용 메모리를 줄일 수 있다.
  • 메모리 단편화 문제를 해결할 수 있다.

🎯 사용 예시

👉 Java의 String Constant Pool 은 생성한 String Object를 Pool에 저장해 두고 있다가 재사용 하는 방식을 가진다. 또한 String.class는 불변 객체로 만들어져 있기도 하다.

 

예제 코드

 

GitHub - icraft2170/Blog-Example-Code

Contribute to icraft2170/Blog-Example-Code development by creating an account on GitHub.

github.com

 

참조

 

오브젝트 풀 (Object Pool)

오브젝트 풀 패턴 (Object Pool Pattern) Object Pool Pattern? 오브젝트 풀 패턴은 생성 디자인 패턴으로, 요청이 들어왔을 때 매번 할당및 삭제를 하는 것이 아니라 미리 만들어 둔 객체 집합 (Pool) 에서 객

internet-craft.tistory.com

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

String Constant Pool이란? | Java String Pool

Java에서 String 객체를 생성하는 방법은 2가지가 있다. 첫번째는 String literal, 즉 큰 따옴표("")를 사용하는 것이고, 두번째는 new 연산자를 사용하는 것이다. 두 방법에는 어떤 차이가 있을까? 간단한

starkying.tistory.com

 

 

Spring Boot 및 Java 16 레코드

In this article, we will discuss Java 16's newest feature, Records. Then we will apply this knowledge and use it in conjunction with a Spring Boot application. 소개하다. 2021년 3월 16일, 자바16이 정식으로 발표되었습니다. 이 새로운

intrepidgeeks.com

 

댓글