[디자인 패턴] 플라이웨이트 패턴 (Flyweight pattern)
플라이웨이트 패턴 (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