• 검색 결과가 없습니다.

단 하나의 인스턴스

N/A
N/A
Protected

Academic year: 2022

Share "단 하나의 인스턴스"

Copied!
16
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

덕성여자대학교 컴퓨터학과

Java로 배우는 디자인패턴 입문

Chapter 5. Singleton 단 하나의 인스턴스

교재: 자바언어로배우는디자인패턴입문(개정판)/YukiHiroshi저/김윤정역/영진닷컴

(2)

01. Singleton 패턴

프로그램 실행 시,

– 하나의 클래스에 대한 인스턴스(객체)가 보통

여러 개

생성된다.

반드시 하나의 인스턴스만 생성되어야 하는 클래스도 있다.

– 예: 컴퓨터 자체를 표현한 클래스, 윈도 시스템을 표현한 클래스

이 경우, 프로그래머가 new MyClass( )를 한번만 실행하면 된 다.

– 그러나, 반드시 1개의 인스턴스만 생성되도록 프로그램(코드)에 표현하고 싶다면,

=> Singleton 패턴을 사용한다.

ch05 Singleton 패턴 2/16

(3)

02. 예제 프로그램

static / public 메소드 생성자가 private 메소드

=> 외부에서 생성자를 호출해서 객 체를 생성하지 못한다.

(4)

02. 예제 프로그램

Singleton 클래스 (리스트5-1)

– private static singleton

 Singleton 클래스의 인스턴스를 생성해서 가리킨다.

 정적 필드로서, Singleton 클래스를 로드할 때 한번만 실행된다.

 private이므로, 외부에서 접근하지 못한다.

– private Singleton( ) 생성자

 private 메소드이므로, 외부에서 new Singleton( )을 호출하지 못함.

– public static Singleton getInstance( )

 Singleton 클래스의 유일한 하나의 인스턴스를 얻을 때 사용하는 메소드

ch05 Singleton 패턴 4/16

(5)

02. 예제 프로그램

Main 클래스 (리스트5-2)

– Singleton.getInstance( )를 이용하여, Singleton 클래스의 객체 를 얻어온다.

 obj1변수와 ojb2 변수가 같은 객체를 참조(같은 객체의 주소를 저 장)하는지 비교

if(obj1 == obj2)

Singleton 객체

obj1:

obj2:

(6)

03. 등장 역할

Singleton의 역할

ch05 Singleton 패턴 6/16

(7)

04. 독자의 사고를 넓혀주는 힌트

왜 제한할 필요가 있는가?

– 인스턴스가 하나만 존재한다는 것이 보증되면, 인스턴스 상호 간에 영향을 주어 생각지 못한 버그가 발생할 가능성이 없어진 다.

유일한 하나의 인스턴스는 언제 생성되는가

– 프로그램 실행 후, 처음으로 Singleton.getInstance( ) 메소드가

호출되면, Singleton 클래스가 메모리에 로드되어 초기화되고,

이 때 static 필드인 singleton 필드가 초기화된다.

(8)

05. 관련 패턴

Abstract Factory 패턴 (8장)

Builder 패턴 (7장)

Facade 패턴 (15장)

Prototype 패턴 (6장)

ch05 Singleton 패턴 8/16

(9)

06. 요약

하나의 인스턴스만 생성되어야 하는 클래스 구현 패턴

(10)

연습 문제

5-1. TicketMaker 클래스에 Singleton 패턴 적용하기

– TicketMaker는 프로그램을 통틀어서 한 개의 인스턴스만 존재 해야 한다.

 이유: 티켓번호는 고유해야 하므로.

– 해답에서, getNextTicketNumber( )를 synchronized로 선언한 이유는?

 다수의 스레드가 동시에 이 메소드를 호출하면, 같은 값을 반환할 위험이 있기 때문

 한 스레드가 synchronized 메소드를 호출하여 실행 시, 다른 스레 드가 그 메소드를 호출하면, 그 메소드 실행이 완료될 때까지 기다 려야 한다.

10/16

ch05 Singleton 패턴

(11)

연습 문제

5-2

– 인스턴수의 개수가 3개로 한정되어 있는 클래스 Triple 만들기

 배열을 이용한다.

(12)

연습 문제

5-3. 리스트5-4(ch05.Q3.Singleton.java)가 Singleton 패 턴이 되지 않는 이유는?

– 구현 방식 설명

 getInstance( ) 메소드에서, singleton 필드가 null 이면 Singleton 객체를 생성하고, null 이 아니면, 현재 있는 Singleton 객체를 반환 한다.

 null 은, 현재 Singleton 객체가 생성되었는지 안 되었는지를 나타 내는 값으로 사용된다.

12/16

ch05 Singleton 패턴

(13)

연습 문제

5-3(계속). 리스트5-4가 Singleton 패턴이 되지 않는 이유는?

– Singleton 패턴이 안 되는 이유(다중 스레드 환경인 경우)

getInstance( ) { } … …

Singleton객체

스레드 A 스레드 B

2. 스레드 A가 getInstance( ) 메소드를 실행하는 중간에 CPU가 스레드 B로 할당되는 경우가 발생한다.

(14)

연습 문제

5-3(계속). 리스트5-4가 Singleton 패턴이 되지 않는 이 유는?

– Singleton 패턴이 안 되는 이유(다중 스레드 환경인 경우)

 두 스레드가 동시에 getInstance( )를 호출한 경우 첫 스레드가 (singleton == null) 인지 비교해서 ‘참’이므로 Singleton 객체를 생 성하고, 그 객체를 singleton 변수에 할당하려고 한다.

 그런데, singleton 변수에 할당하기 직전에, 다른 스레드가 CPU를 할당받고 getInstance( )를 호출하여 (singleton == null) 을 비교하 는 경우가 있다. 아직 singleton 변수에는 Singleton 객체가 할당되 어 있지 않으므로, 비교 결과가 또 참이 되어 Singleton 객체를 또 생성하려고 한다.

14/16

ch05 Singleton 패턴

(15)

연습 문제

5-3(계속). 리스트5-4가 Singleton 패턴이 되지 않는 이 유는?

– 결과적으로 두 개 이상의 Singleton 객체가 생성될 수 있다.

– 예: 443~444페이지

 ch05.A3_2

– 이 예제는 다중 스레드 프로그램이 아니다.

• Main이 Thread 클래스를 상속받지 않았음

– 따라서, Singleton 클래스는 항상 하나의 인스턴스만 생성된다.

 ch05.A3_1 (다중 프로그램이다)

– Main이 Thread 클래스를 상속받음으로써 스레드가 된다.

– 생성자 Singleton( )에서, 객체 생성시 일부러 속도를 늦추기 위해서 sleep 하고 CPU를 내 놓는다. => 두 개 이상의 인스턴스가 생성될 확

(16)

연습 문제

5-3(계속). 리스트5-4가 Singleton 패턴이 되지 않는 이 유는?

해결책

 getInstance( ) 메소드를 synchronized로 선언한다.

– 동시에 두 개 이상의 스레드가 getInstance( ) 메소드 안으로 들어오지 않도록 막는다.

16/16

ch05 Singleton 패턴

참조

관련 문서

실행 중인

after image 모든 레코드 공통 type에 따라 추가되는 필드.. DBS는 파일들을 메모리에 두고 필요할 때 디스크를 갱신 하려,,.. 그림자 페이지 및 현행

메모리 저장 중지(용량 초과) 내부 메모리에 용량이 초과되어 저장이 중지되었습니다.. 메모리 저장 중지(파일수 초과) 내부

스피치 경험 부족한 사람에게 유혹적인 방법이지만 청중 반응에 적응할 수 없기 때문에 유능한 연사는 절대로 채택하지 않는다..  대본 낭독-실행 노력이 별로 필요하지 않고 불안증도

자바에서 처리하는 예외는 모두 Exception 클래스에서 파 Exception 클래스는 Throwable 클래스의 하위 클래스임 결국 모든 예외 클래스가 Throwable의 하위

• 이바노프: 백조와 왕자의 2인무는 프티파가 확립한 그랑 파드되 형식에서 벗어나 단 하나의 확장된

 getInstance( ) 메소드에서, singleton 필드가 null 이면 Singleton 객체를 생성하고, null 이 아니면, 현재 있는 Singleton 객체를 반환 한다.  null 은, 현재 Singleton

– 이벤트가 발생하면, 등록되어 있던 이벤트 리스너의 메소드가 실행된다... 사용자가 버튼을 누르면,