소프트웨어 개발/Design Pattern

③ 디자인 패턴(Design Pattern) - Flyweight

늘근이 2015. 8. 22. 16:57

Flyweight 패턴은, 객체를 어마어마하게 많이 생성해야 할때 메모리가 굉장히 많이 들것을 대비하여, 최대한 공유가능한 부분을 이용해 가볍게 부담을 줄여주는 패턴이다.

일단 UML을 한번 엿보고 계속해보자.


출처 http://wiki.western.edu/mcis/



웹과 같은 화면상에 여러개 구성요소가 존재할수 있는데, 만약 이미지같은것들이 동일하게 반복되고 있다면 별로 바람직하지 않다. 따라서 재사용할건 재사용하고 만들건 만들어서 좀 효용성이 있게 프로그램을 구성하면 좋다!


일단 인터페이스를 하나 만들자. 도형 인터페이스다.

public interface Shape {
	void draw();
}

이를 상속해서 다음과 같은 사각형 클래스를 만들자.

사각형 클래스는 내부에 color와 length 를 가지고 있다.

public class Square implements Shape{
	
	private String color;
	private int length;
	
	public Square(String color) {
		this.color = color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public void setLength(int length) {
		this.length = length;
	}

	@Override
	public void draw() {
		System.out.println("draw " + color + " square " + length + " big");
	}

}

그리고 다음과 같이 공장을 하나 만들어주자. 이공장은, 벌서 객체중에 겹치는 쓸만한 놈이 있다면 객체를 그걸 찾아 주고 아니면 하나 만들어서 준다. 따라서 무조건 찍어내는 공장이라기보다는 주문을 받아 있으면 바로 주고 아니면 만들어서 주는 똑똑한 놈이다. 내부에는 HashMap이 하나 존재하는데, 이놈은 이 공장은 가지고 있는 재고 리스트를 관리할 필요성이 있기 때문이다.

public class ShapeFactory {
	
	private static final HashMap squareMap = new HashMap<>();
	
	public static Shape getSquare(String color) {
		
		Square square = (Square)squareMap.get(color);
		
		if (square == null) {
			square = new Square(color);
			squareMap.put(color, square);
		}
		return square;
		
	}
}

마지막으로 테스트를 하나 해보자. 빨갱이 네모 square1, square2,를 두개 만들어줘서 객체가 그놈이 그놈인지 확인해본다. 그리고 초록이 square3도 하나 만들어줘서 이것도 같은 놈인지 한번 확인해보자.

public class Main {

	public static void main(String[] args) {

		Square square1 = (Square) ShapeFactory.getSquare("red");
		System.out.println(square1);

		Square square2 = (Square) ShapeFactory.getSquare("red");
		System.out.println(square2);
		
		Square square3 = (Square) ShapeFactory.getSquare("green");
		System.out.println(square3);

	}
}



이제 결과를 확인해보면, 다음과 같다. 메모리 주소를 한번 자세히 들여다보자

flyweight.Square@659e0bfd
flyweight.Square@659e0bfd
flyweight.Square@2a139a55


처음 두개는 메모리주소가 같으며 나중에 만든 사각형은 메모리주소가 다르다. 그렇다는 뜻은 처음 두개 빨갱이는 이름은 달라도 결국은 같은 값을 가르키고 있다는 점이며 나중 초록이는 다른 객체라는 뜻이다.

 

즉 Flyweight 패턴은 각 종류별로 하나만 튀어나오는 똑똑한놈이다. 굳이 같은놈을 두번만들지 말자는 주의인것이다.