Java로 배우는 디자인패턴 입문 Chapter 20. Flyweight 동일한 것을 공유해서 낭비를 없앤다

Slides:



Advertisements
Similar presentations
비즈쿨 - 정 성 욱 - - 금오공고 비즈쿨 - 정 성 욱 1. 나는 각 단원들의 활동들에 성실하게 참여 하겠습니다. 우리의 다짐 2. 나는 나와 전체의 발전을 위해 각 멘토들의 지도에 순종하겠습니다. 3. 나는 각 단원들을 숙지함으로써 비즈니스 마인드를 함양하고 자신의.
Advertisements

ㅋㅋ 다른 집단과 명확히 구별되는 가치체계와 지식 그리고 그에 부합하는 기술을 가지고 있어야 한다. 가치체계 - 사회복지사윤리강령, 선서 등 기본요소 완성 지식 - 사회복지사 1 급 자격증 시험으로 완성 기술 - 명확하지 않으나 실습, 보수교육을 통해 완성 Client.
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
아름다운 이들의 행복한 길음안나의 집.
6.1 사용사례 6.2 객체 모델링 6.3 동적 모델링 6.4 시스템 설계 6.5 객체 설계 6.6 디자인 패턴
Chapter 02. C언어 기반의 C++ 박 종 혁 교수 UCS Lab SeoulTech Tel:
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
2장 닷넷 프레임워크.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
데이터 관리의 모든 것 데이터 최적화하기 데이터 정렬하기 자동 필터와 고급 필터
Java로 배우는 디자인패턴 입문 Chapter 0. UML 과 Design Pattern
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
JAVA 언어로 배우는 디자인 패턴 입문 chap. 1-2.
2강. JAVA 프로그래밍이란?-II & 변수 JAVA 프로그램 환경설정과 실행 방법 변수란?
명품 JAVA Essential.
[INA470] Java Programming Youn-Hee Han
8장 자바 입출력.
IOC, DI 2015 Web Service Computing.
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
7 스택.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
Java Programming Language (4)
명품 Java Programming.
Java의 정석 제 12 장 쓰레드(thread) Java 정석 남궁성 강의
최용술 장 Thread 최용술
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
윤 홍 란 4 장 클래스 작성 윤 홍 란
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
Power Java 제7장 클래스와 객체.
DataScience Lab. 박사과정 김희찬 (월)
컴퓨터 활용 및 실습 Chapter 3 수식과 함수 김 정 석
주소록 프로그램.
Java로 배우는 디자인패턴 입문 Chapter 10. Strategy 알고리즘을 모두 교체하다
자바 5.0 프로그래밍.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
[Homework #2] Chapter 5 Chapter 6 Page 110, 문제 13 – 피라미드 높이 구하는 문제
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
DataScience Lab. 박사과정 김희찬 (월)
가상현실연구실 박정식 증강현실 예제 가상현실연구실 박정식
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의
칼빈의 생애와 개혁자로의 변모 사학과 김종식.
프로그래밍 원리 Chapter 04 자료 처리와 연산자 신한대학교 IT융합공학부 박 호 균.
4장 - PHP의 표현식과 흐름 제어-.
국제의료관광 관련 법, 제도.
Java로 배우는 디자인패턴 입문 Chapter 14. Chain of Responsibility 책임 떠넘기기
Java Chapter 4 ~ 주차.
컴퓨터공학실습(I) 3주 인공지능연구실.
Java의 정석 제 4 장 조건문과 반복문 Java 정석 남궁성 강의
Spring DI 이해 및 활용.
자바 5.0 프로그래밍.
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
- 과거 500년의 조선과 동아시아 정세를 중심으로 -
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
자바 5.0 프로그래밍.
CHAPTER 9-1 한국의 사회복지정책 - 사회보험제도 -
6월 1주 주간메뉴표 NEW 엄마손 조식 쉐프 삼촌 중식 참새 방앗간 석식 ◎원산지 안내 : 쌀(국내산)
▶서류관리 프로그램 1. 로그인….2 2. 서류등록 … 서류도착 서류스티커발행
자료구조 강의소개 정성훈 연락처 : 이메일 : 연구실 : 연219호 연락처 : 이메일 : 홈페이지: 정성훈.
DataScience Lab. 박사과정 김희찬 (화)
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
Choi Younghwan CSE HUFS
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용
경찰학 세미나 제 5 강 경찰관직무집행법 2조 5호의 의미 신라대학교 법경찰학부 김순석.
Presentation transcript:

Java로 배우는 디자인패턴 입문 Chapter 20. Flyweight 동일한 것을 공유해서 낭비를 없앤다 2004-1 덕성여자대학교 컴퓨터학부

복싱에서의 ‘플라이급’을 의미한다. => 매우 가벼움 가볍다 == 메모리의 사용량이 적다. 01. Flyweight 패턴 복싱에서의 ‘플라이급’을 의미한다. => 매우 가벼움 가볍다 == 메모리의 사용량이 적다. new Something( )이 실행되면, Something 클래스의 인스턴스를 보관하기 위한 메모리가 할당된다. Flyweight 패턴의 아이디어 인스턴스를 가능한 한 공유시켜서, 쓸데없이 new를 하지 않도록 한다. 인스턴스가 필요할 때 마다 new를 하는 것이 아니라, 이미 만들어져 있는 인스턴스를 이용할 수 있으면 공유하자. /42

02. 예제 프로그램 ‘큰 문자’를 출력하는 프로그램 /42

02. 예제 프로그램 /42

주요 클래스 02. 예제 프로그램 BigChar BigCharFactory ‘큰 문자’를 나타내는 클래스 파일로부터 큰 문자의 텍스트를 읽어 메모리 상에 축적하고, print 메소드에서 그것을 표시한다. 큰 문자는 메모리를 많이 차지하므로, BigChar의 인스턴스를 공유하자. BigCharFactory BigChar 클래스의 인스턴스를 만든다. 같은 문자에 대응하는 BigChar 클래스의 인스턴스가 이미 존재하는 경우에는, 이것을 이용하고 새로운 인스턴스는 만들지 않는다. 지금까지 만들어진 BigChar 클래스의 인스턴스는 모두 pool이라는 필드에 보관함. (Hashtable을 이용함) /42

BigChar 클래스 02. 예제 프로그램 ‘큰 문자’를 나타내는 클래스 생성자 인수로 제공된 문자의 ‘큰 문자’ 버전을 작성한다. 작성된 문자열은 fontdata에 저장함 예를 들어, 생성자의 인수로 ‘3’이 주어지면, 다음과 같은 문자열이 fontdata에 저장됨 <= 이 data는 big3.txt 에서 읽어온다. 파일로부터 한 라인씩 읽어서, “\n”과 함께 buf 에 추가한다. buf.toString( )을 이용해서 문자열로 바꾼다음 fontdata에 할당한다. ....######......\n ..##......##....\n ..........##....\n ......####......\n ................\n /42

BigCharFactory 클래스 02. 예제 프로그램 BigChar의 인스턴스를 작성하는 공장 여기서 인스턴스의 공유가 실현된다. pool 필드: 지금까지 만든 BigChar의 인스턴스들을 모아서 관리한다. java.util.Hashtable을 이용함 “문자열(key) -> 인스턴스(value)” 대응관계를 관리해 주는 클래스 put(key, value)를 이용하여 문자열에 하나의 인스턴스를 대응해서 넣음. get(key)를 이용하여, 문자열에 대응하는 인스턴스를 얻어옴. Singleton 패턴으로 구현됨 singleton 필드 생성자는 private으로 선언함 getInstance( ) 메소드 /42

BigCharFactory 클래스 02. 예제 프로그램 getBigChar( ) Flyweight 패턴의 중심이 되는 메소드 이미 같은 문자에 대응하는 인스턴스가 존재하면 새로운 인스턴스를 만들지 않고, 이전에 만든 인스턴스를 반환한다. /42

1 2 1 2 1 2 3 BigString 클래스 02. 예제 프로그램 BigChar들을 모은 ‘큰 문자열’ 클래스 인스턴스가 너무 많이 생긴다 /42

02. 예제 프로그램 BigString 클래스 필드 bigchars 배열의 각 원소는 BigCharFactory로부터 BigChar를 얻어서 참조한다. BigCharFactory은, 이미 생성된 BigChar인 경우에는 기존의 BigChar 인스턴스를 반환하므로, bigchars 배열의 각 원소는 같은 문자에 대해서는 BigChar 객체를 공유한다. (참고) 매번 새로운 인스턴스를 생성하는 경우 BigCharFactory factory = BigCharFactory.getInstance(); for (int i = 0; i < bigchars.length; i++) { bigchars[i] = factory.getBigChar(string.charAt(i)); } 문자열 중에서 i 번째 문자 for (int i = 0; i < bigchars.length; i++) { bigchars[i] = new BigChar(string.charAt(i)); } /42

Main 클래스 02. 예제 프로그램 명령행 인자로 들어온 문자열을 실인자로 해서, BigString( ) 객체를 생성한다. /42

FlyweightFactory(플라이급의 공장)의 역할 03. 등장 역할 Flyweight(플라이급)의 역할 평소대로 취급하면 프로그램이 무거워져서(메모리 많이 차지해서) 공유하는게 훨씬 좋은 역할 예제에서는, BigChar 클래스가 해당됨 FlyweightFactory(플라이급의 공장)의 역할 Flyweight 역할을 만드는 공장의 역할 공장을 사용해서 Flyweight 역할을 만들면, 인스턴스가 공유된다. 예제에서는, BigCharFactory 클래스가 해당됨 /42

03. 등장 역할 Client(의뢰자)의 역할 FlyweightFactory를 사용해서 Flyweight 역할을 만들어내서 이용하는 역할 예제에서는, BigString 클래스가 해당됨 /42

03. 등장 역할 /42

여러 곳에 영향이 미친다. 04. 독자의 사고를 넓혀주는 힌트 Flyweight 패턴의 핵심은, 인스턴스를 ‘공유’하는 것이다. 주의해야 할 점 공유하고 있는 것을 변경하면 여러 곳에 동시에 영향이 미친다. 꼭 공유시켜야 할 정보를 Flyweight 역할에 맡겨라. 예: 예제 프로그램에, ‘채색된 큰 문자열’을 사용하고자 할 때 색깔 정보를 어느 클래스에 두어야 할까? 방법1: BigChar에 두는 방법 => BigString 내의 공유되는 모든 BigChar 인스턴스는 동일한 색을 가지게 된다. 방법2: BigString에 두는 방법 => “몇 번째 문자는 무슨 색깔”이라는 정보를 BigString이 가지고 있으므로, 공유되는 BigChar 인스턴스라도 다른 색깔로 표현될 수 있다. 항상 어떤 정보를 공유시킬지 신중히 생각해야 한다. /42

instrinsic(본질적인, 내재하는)과 extrinsic(부대적인, 비본질적인) 04. 독자의 사고를 넓혀주는 힌트 instrinsic(본질적인, 내재하는)과 extrinsic(부대적인, 비본질적인) instrinsic한 정보: 공유되어야 하는 정보 상태에 의존하지 않는 정보 예: BigChar의 폰트 데이터 extrinsic한 정보: 공유시키지 말아야 할 정보 상태에 따라 바뀌는 정보를 의미함 BigChar의 인스턴스가 BigString의 몇 번째 문자인가라는 정보는 BigChar가 위치하는 장소에 따라 변하기 때문에, BigChar에게 부여할 수 없다. /42

관리되고 있는 인스턴스는 쓰레기수집(Garbage collection)이 되지 않는다. 04. 독자의 사고를 넓혀주는 힌트 관리되고 있는 인스턴스는 쓰레기수집(Garbage collection)이 되지 않는다. BigChar 인스턴스는 Hashtable에 의해서 관리된다. 따라서, 절대 쓰레기 수집이 되지 않는다. 쓰레기 수집 자바는 new 연산자에 의해 객체를 생성하고, 메모리를 확보한다. 객체가 많아지면, 메모리가 부족해지고, 자바 가상 기계는 쓰레기 수집이라는 처리를 시작한다. 메모리 공간을 조사하며, 사용되지 않는 인스턴스를 제거하고 메모리의 빈 영역을 늘인다. /42

메모리 이외의 리소스 04. 독자의 사고를 넓혀주는 힌트 프로그램에서의 리소스 메모리 공간 시간 Flyweight 패턴을 사용하면, new 횟수를 줄이므로 프로그램의 속도를 높일 수 있다. /42

05. 관련 패턴 Proxy 패턴 Composite 패턴 Singleton 패턴 /42

메모리의 소비를 적게 하기 위해, 인스턴스를 공유시키는 Flyweight 패턴 06. 요약 메모리의 소비를 적게 하기 위해, 인스턴스를 공유시키는 Flyweight 패턴 /42

20-1 20-2 연습 문제 BigString(String string, boolean shared) shared가 true 일 때는 BigChar를 공유하고 shared가 false 일 때는 BigChar를 공유하지 않음 20-2 BigChar 인스턴스를 공유한 경우와 공유하지 않은 경우의 메모리 소비량을 비교하라. 메모리 소비량을 얻는 방법 Runtime.getRuntiem().gc(); long used = Runtime.getRuntime().totalMemory() – Runtime.getRuntime().freeMemory() System.out.println(“사용메모리 = “ + used); /42

연습 문제 20-3 BigCharFactory의 getBigChar( )가 synchronized로 선언된 이유는? /42