정처기 감자정처기 감자
SW 설계디자인패턴

플라이웨이트 flyweight 패턴 - 자바스크립트 예제

SW설계디자인패턴
읽는데 12분 소요
처음 쓰인 날: 2025-09-01
마지막 수정일: 2025-09-01
조회수: —

요약

플라이웨이트(Flyweight) 패턴을 자바스크립트 코드와 함께 알아봅니다. 정보처리기사 대비 문제가 포함되어있습니다.

플라이웨이트 패턴 요약

패턴 종류핵심 키워드
플라이웨이트 (Flyweight)객체 공유 , 가상 인스턴스 제공, 메모리 사용량 줄입니다.
플라이웨이트 패턴 감자
플라이웨이트 패턴 감자

플라이웨이트 (Flyweight) 패턴

플라이웨이트 패턴은 많은 수의 객체를 효율적으로 지원하기 위해 객체의 공유를 통해 메모리 사용량을 줄이는 디자인 패턴입니다. '플라이웨이트'는 권투의 경량급을 의미하며, 이름처럼 객체를 가볍게 만들어 메모리 부담을 최소화하는 데 목적이 있습니다.

이 패턴은 객체의 상태를 두 가지로 분리합니다.

  • 내재적 상태 (Intrinsic State): 객체 내부에서 관리되며, 여러 컨텍스트에서 공유될 수 있는 불변(immutable)의 상태입니다. 플라이웨이트 객체 내에 저장됩니다. (예: 나무의 모델, 텍스처, 색상)
  • 외재적 상태 (Extrinsic State): 각 객체마다 달라질 수 있으며, 클라이언트가 관리하고 필요할 때 플라이웨이트 객체에 전달하는 상태입니다. (예: 나무의 위치(x, y 좌표), 크기)

기본 구조

  • Flyweight: 공유될 객체들의 인터페이스를 정의합니다.
  • ConcreteFlyweight: Flyweight 인터페이스를 구현하고, 내재적 상태를 저장합니다. 이 객체는 공유되어 재사용됩니다.
  • FlyweightFactory: 플라이웨이트 객체들을 생성하고 관리하는 팩토리입니다. 클라이언트가 요청한 플라이웨이트가 이미 존재하면 기존 객체를 반환하고, 없으면 새로 생성하여 풀(pool)에 저장합니다.
  • Client: 외재적 상태를 관리하고, FlyweightFactory를 통해 플라이웨이트 객체를 받아 필요한 작업을 수행합니다.

예시: 게임에서 수많은 나무 렌더링하기

수천, 수만 그루의 나무로 숲을 표현해야 하는 게임을 만든다고 가정해 봅시다. 각 나무마다 모델, 텍스처 등 무거운 데이터를 가진 객체를 생성한다면 엄청난 메모리가 소모될 것입니다. 플라이웨이트 패턴을 사용하면 이 문제를 효과적으로 해결할 수 있습니다.

먼저, 공유될 나무 모델(TreeModel)을 정의합니다.

javascript
코드 하이라이팅 중…

이제 TreeModel 객체를 관리하는 TreeModelFactory를 만듭니다.

javascript
코드 하이라이팅 중…

클라이언트(게임 엔진) 코드에서 팩토리를 통해 나무를 생성하고 화면에 그립니다.

javascript
코드 하이라이팅 중…

출력 결과:

text
코드 하이라이팅 중…

숲에 4그루의 나무를 심었지만, 실제로 메모리를 많이 차지하는 TreeModel 객체는 '소나무'와 '참나무' 단 2개만 생성되었습니다. '소나무' 모델은 한 번 생성된 후 계속 재사용되었습니다. 각 나무의 고유한 정보(위치, 크기 등)는 외재적 상태로 클라이언트가 직접 관리합니다.

이처럼 플라이웨이트 패턴은 공유 가능한 상태(내재적 상태)를 가진 객체를 재사용하여 메모리 사용량을 획기적으로 줄일 수 있습니다.

'가상 인스턴스'는 무슨 의미일까?

"여러 개의 가상 인스턴스를 제공해서 메모리를 절감한다"는 표현은 플라이웨이트 패턴의 핵심을 잘 나타내지만, '가상 인스턴스'라는 용어 때문에 헷갈릴 수 있습니다.

'고무 도장' 비유를 통해 쉽게 이해해 봅시다.

수천 페이지 분량의 문서에 '소나무' 그림을 계속 찍어야 한다고 상상해 보세요.

  • 플라이웨이트 패턴 미적용: 나무 1,000그루를 찍으려면, 실제 '소나무' 도장 1,000개가 필요합니다. 도장을 보관할 엄청나게 큰 공간(메모리)이 필요합니다.
  • 플라이웨이트 패턴 적용:
    1. '소나무' 모양의 고무 도장 딱 하나만 만듭니다. 이 도장이 바로 플라이웨이트 객체이며, '소나무'라는 본질적인 모양(내재적 상태)을 가집니다.
    2. 나무를 찍을 때마다 이 유일한 '소나무' 도장을 재사용합니다.
    3. 대신, 나무마다 달라지는 정보, 즉 어디에(x, y 좌표), 어떤 크기로 찍을지는 도장을 찍는 순간에 외부에서 알려줍니다. 이것이 바로 외재적 상태입니다.

여기서 '가상 인스턴스' 란, 우리 눈에 보이는 각각의 '소나무' 그림을 의미합니다. 실제 메모리에는 '소나무' 모양을 가진 객체(도장)는 단 하나만 존재하지만, [공유되는 실제 객체 1개] + [각기 다른 외부 상태(좌표, 크기)] 의 조합으로 마치 여러 개의 독립된 객체가 있는 것처럼 '보여주는' 것입니다.

게임 예제에서 TreeModel 객체는 단 2개('소나무', '참나무')만 생성되었지만, 화면에는 4그루의 나무, 즉 4개의 '가상 인스턴스'가 보이는 것과 같습니다.

플라이웨이트 패턴 중요 키워드

  • 객체 공유와 가상 인스턴스 제공을 통해 메모리 사용량을 줄입니다.
  • 객체의 상태를 내재적 상태(공유 가능) 와 외재적 상태(공유 불가) 로 분리합니다.
  • 팩토리를 사용하여 공유 객체를 관리합니다.
  • 게임, 문서 편집기 등 대량의 객체를 효율적으로 다뤄야 할 때 매우 유용합니다.

정처기 실기 대비 문제

문제를 불러오는 중이에요.
메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)

관련 글

(42개)
제목태그업데이트시험
디자인패턴 정보처리기사 실기 모의 시험
디자인패턴SW설계디자인패턴
2026-07-10응시
추상 팩토리 abstract factory 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2026-10-20-
빌더 builder 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-02-
디자인패턴23개
제목태그업데이트시험
디자인패턴 정보처리기사 실기 모의 시험
디자인패턴SW설계디자인패턴
2026-07-10응시
추상 팩토리 abstract factory 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2026-10-20-
빌더 builder 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-02-
팩토리 메서드 factory method 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-11-03-
프로토타입 prototype 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2026-10-20-
싱글톤 singleton 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-02-
책임 연쇄 chain of responsibility 패턴 - 타입스크립트 예시
디자인패턴SW설계디자인패턴
2025-11-03-
커맨드 command 패턴 - 타입스크립트 예시
디자인패턴SW설계디자인패턴
2025-09-01-
인터프리터 interpreter 패턴 - 타입스크립트 예시
디자인패턴SW설계디자인패턴
2025-09-01-
이터레이터 iterator 패턴 - 타입스크립트 예시
디자인패턴SW설계디자인패턴
2025-09-01-
중재자 mediator 패턴 - 타입스크립트 예제
디자인패턴SW설계디자인패턴
2026-10-20-
메멘토 memento 패턴 - 타입스크립트 예시
디자인패턴SW설계디자인패턴
2025-10-29-
옵저버 observer 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-01-
상태 state 패턴 - 타입스크립트 예시
디자인패턴SW설계디자인패턴
2025-09-01-
전략 strategy 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-01-
템플릿 메서드 template method 패턴 - 타입스크립트 예시
디자인패턴SW설계디자인패턴
2025-09-01-
방문자 Visitor 패턴 - 타입스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-01-
어댑터 adapter 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-02-
브릿지 bridge 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-01-
컴포지트 composite 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-01-
데코레이터 decorator 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-01-
퍼사드 facade 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2025-09-01-
프록시 proxy 패턴 - 자바스크립트 예제
디자인패턴SW설계디자인패턴
2026-10-20-
SW설계19개
제목태그업데이트시험
릴리스 노트 작성 항목
제품 소프트웨어 패키징SW설계제품 소프트웨어 패키징
2026-06-26-
UI 정보처리기사 실기 모의 시험
UI/UXSW설계UI/UX
2026-05-04응시
애자일(Agile) 방법론
애자일SW설계방법론애자일
2026-10-01-
코딩 컨벤션과 표기법
코딩 스타일SW설계코딩 스타일
2026-10-01-
소프트웨어 비용 산정 기법
비용 산정SW설계비용 산정
2026-10-01-
비기능 요구사항
요구사항SW설계요구사항
2026-10-16-
리팩토링(Refactoring)
리팩토링SW설계리팩토링
2026-10-01-
UI 설계 원칙
UI/UXSW설계UI/UX
2026-10-01-
UI 종류 (CLI·GUI·NUI·OUI·VUI)
UI/UXSW설계UI/UX
2026-10-01-
SW 설계 왕감자 정보처리기사 실기 모의 시험
SW설계SW설계
2025-11-04응시
앱 설계(디자인패턴, 응집도-결합도,객체지향) 정보처리기사 실기 모의 시험
앱설계SW설계앱설계
2025-10-08응시
객체 지향 설계 원칙 - SOLID
객체지향SW설계앱설계객체지향
2026-10-20-
럼바우 객체 모델링 - 객(정)동기
객체지향SW설계앱설계객체지향
2026-10-20-
UML 정보처리기사 실기 모의 시험
UMLSW설계UML
2025-10-08응시
소프트웨어 아키텍처 4+1 뷰 모델
UMLSW설계UML
2025-09-26-
UML 클래스 다이어그램의 6가지 관계
UMLSW설계UML
2026-10-11-
UML 다이어그램
UMLSW설계UML
2026-10-20-
소프트웨어 모듈 응집도와 결합도
응집도/결합도SW설계앱설계응집도/결합도
2026-10-20-
정보처리기사 실기를 위한 디자인 패턴 암기 방법
앱설계SW설계앱설계
2026-10-16-

댓글

댓글을 불러오고 있어요
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999