30
백백백 백백백 백백백백백

백엔드 스터디 3주

Embed Size (px)

Citation preview

Page 1: 백엔드 스터디 3주

백엔드스터디디자인패턴

Page 2: 백엔드 스터디 3주

참고도서

Head First Design Patterns 자바객체지향디자인패턴 객체지향과디자인패턴

Page 3: 백엔드 스터디 3주

싱글턴패턴

Page 4: 백엔드 스터디 3주

싱글턴패턴● 싱글턴 패턴 정의

○ 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고 , 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴

● 싱글턴 패턴언재 사용 하나 ?

○ 설정 정보를 저장하고 있는 객체나 , 프린터나 그래픽 카드와 같은 디바이스 드라이버와 같은 객체에 사용 할 수 있다 .

Page 5: 백엔드 스터디 3주

싱글턴패턴설계● 기본 설계

Singletone

- instance

+ getInstance()

Page 6: 백엔드 스터디 3주

간단한싱글턴만들기● 간단한 싱글턴 패턴 구현

생성자를 외부에서 호출할 수 없게

Page 7: 백엔드 스터디 3주

간단한싱글턴만들기● Main

Page 8: 백엔드 스터디 3주

싱글턴패턴예제● 프린터 객체를 만들어 사용자 객체가 사용하는 예제

Page 9: 백엔드 스터디 3주

싱글턴패턴예제● 사용자가 프린터 객체를 사용

Page 10: 백엔드 스터디 3주

싱글턴패턴예제● 실행 결과

Page 11: 백엔드 스터디 3주

간단한싱글턴문제발생● 스레드로 동작하도록 변경

Page 12: 백엔드 스터디 3주

싱글턴패턴예제 - 스레드적용● 프린트 객체를 만들어 사용하는 예제에 스레드 적용

Page 13: 백엔드 스터디 3주

싱글턴패턴예제 - 스레드적용● 사용자 클래스에 스레드 적용

Page 14: 백엔드 스터디 3주

싱글턴패턴예제 - 스레드적용● 실행 결과

Page 15: 백엔드 스터디 3주

싱글턴패턴스레드문제해결● 객체를 미리 생성하여 해결 하기● Synchronized 사용하여 해결 하기● DCL(Double Checking Locking) 사용하여 해결 하기

Page 16: 백엔드 스터디 3주

미리싱글턴객체생성하기● 미리 싱글턴 객체 생성하기

○ private static Singleton instance = new Singleton();

●단점○ 한번도 호출 하지 않을 경우 메모리 낭비

Page 17: 백엔드 스터디 3주

미리싱글턴객체생성하기 - 프린트예제● 프린터 객체 미리 생성하기

Page 18: 백엔드 스터디 3주

미리싱글턴객체생성하기 - 프린트예제

Page 19: 백엔드 스터디 3주

미리싱글턴객체생성하기 - 프린트예제● 미리 프린트 객체 생성 결과

Page 20: 백엔드 스터디 3주

Synchronized 사용하기● Synchronized 사용하여 해결 하기

● 단점○ Synchronized 비용이 비싸다 .

○ 자주 호출 되는 경우 성능에 문제 발생 ( 성능이 100 배 정도 저하 )

Page 21: 백엔드 스터디 3주

Synchronized 사용하기 - 프린트예제● Synchronized 적용 하기

Page 22: 백엔드 스터디 3주

Synchronized 사용하기 - 프린트예제

Page 23: 백엔드 스터디 3주

Synchronized 사용하기 - 프린트예제● Synchronized 적용 결과

Page 24: 백엔드 스터디 3주

DCL(Double Checking Locking) 사용하기● DCL 사용하기

● Java 1.5 이상에서 동작

Page 25: 백엔드 스터디 3주

Volatile

● Volatile 변수를 읽어 들일 때 CPU 캐시가 아니라 메인 메모리부터 읽어들임

출처 : http://thswave.github.io/java/2015/03/08/java-volatile.html

Page 26: 백엔드 스터디 3주

정적클래스를사용하기● 프린터 객체의 print 메소드를 정적으로 만들기

Page 27: 백엔드 스터디 3주

정적클래스를사용하기● 정적 클래스로 사용 하기

Page 28: 백엔드 스터디 3주

정적클래스를사용하기● Interface 를 사용할 경우 정적 클래스로 만들기 힘듬

○ 문법 오류 발생

RealPrinter

+ print(String str)

TestPrinter

+ print(String str)

Printer

+ print(String str)

Page 29: 백엔드 스터디 3주

Java 에서싱글턴패턴적용사례● java.lang.Runtime

○ Java 에서 외부 프로세스를 실행할 때 사용

Page 30: 백엔드 스터디 3주

Java 에서싱글턴패턴적용사례● java.lang.Runtime 코드