CheerUp_Cheers

Static, 싱글턴, 내포 클래스 - 싱글턴 본문

인프런/개체지향 프로그래밍 및 설계 (Java)

Static, 싱글턴, 내포 클래스 - 싱글턴

meorimori 2020. 12. 1. 18:14

싱글턴 패턴

어떤 클래스에서 만들 수 있는 인스턴스를 하나로 제한
다음과 같은 조건 충족하는 개체에 적합
 1) 프로그램 실행중 하나만 있어야함 ex) 프로그램설정, 파일시스템
 2)  이 개체에 전역적으로 접근이 가능해야함

 

#싱글턴 클래스 다이어그램

- private 생성자

- static 메소드를 통해서만 개체 얻음

- 아직 개체가 없는 경우

 개체를 생성 후 static 변수에 저장

 static 변수에 저장된 개체를 반환

- 이미 개체가 있는 경우

 static 변수에 있는것 반환

 

#싱글턴 예

 

#어디쓸까

Configuration(구성) - 프로그램 창의 위치와 크기, 파일에 저장하거나 로딩.

 

#싱글턴 vs Static

다 static으로하면 개체도 안만들어도 되고 괜찬지않나?

 

- static으로 못하는 일

 1) 다형성 사용 불가

 2) 시그내처를 그대로 둔채 멀티턴패턴으로 바꿀 수 없다. (개체의 숫자가 하나가아니고 몇개로 정한것)

 3) 개체의 생성 시점을 제어할 수 없다.

  -> Java의 static은 프로그램 실행 시에 초기화 됨

  -> 단, 싱글턴도 제어에 어려움 있음.

 

# 싱글턴 개체의 생성 시기

 처음으로 getInstanse()를 사용할떄,

 -> 다양한 메서드에서 getInstance()를 사용할 수 도 있음.

 

- 초기화 순서를 보장하는 방법

 외부 API사용할 떄, 순서가 중요할떄가 있음..

 프로그램 시작시 여러 싱글턴을 getInstance()를 순서대로 호출..

// 싱글턴을 정해진 순서대로 초기화 해야할 때
 B.getInstance();
 A.getInstance(); 
 C.getInstance();

 

# 싱글턴 생성시 인자가 필요한 경우?

다른 클래스에서 loader와 gfxDevice라는 매개변수가 없을 경우가 있음..

-> 싱글턴은 필요에 따라서 변형해서 사용하는것도 괜찬음

 

# 싱글 턴의 변형 예

 

1)프로그램 실행시

 getInstance()가 아닌 createInstance()로 호출

 GrapicsResourceManager.createInstatnce(loader, gfxDevice);

 

2) 인스턴스가 필요할 떄

 매개변수 없는 getInstance()호출

GrapicsResourceManager gfxManager = GrapicsResourceManager.getInstance();

-> cerateInstance()가 먼저 호출됐따는 가정으로 도는 코드

-> 언제나 유효한 상태를 추구하는 OO정신에는 어긋남.

 

3)프로그램 종료시

메모리 해제.

GrapicsResourceManager.deleteInstancae();

 

 

#변형되는것은 사용하지 말아야하나?

실행시 초기화나 종료시 청소하는 함수는 실무로 자주 사용됨.

-> 뺴먹기 어려운 함수들임.. 

 

#싱글턴을 안티패턴이라고도 하는데?

안티패턴 : 나쁜 습관, 잘못된 방법

- 이유

 static과 똑같다는 이유에서 욕함.

 싱글턴 안쓰고도 같은일 할수도 있음

  -> 복잡해짐..

 

- 반박

 필요한 도구 중 하나.

'인프런 > 개체지향 프로그래밍 및 설계 (Java)' 카테고리의 다른 글

상속  (0) 2020.12.13
Static, 싱글턴, 내포 클래스 - 디자인 패턴  (0) 2020.12.01
Static, 싱글턴, 내포 클래스  (0) 2020.11.26
개체 모델링1  (0) 2020.11.26
클래스  (0) 2020.11.25