본문 바로가기

BackEnd/Java

0922 JAVA - 자바 싱글톤 클래스(SingletonClass)

728x90
반응형

자바 싱글톤 클래스(SingletonClass)

 

단 하나의 유일한 인스턴스만을 생성하여 공유하도록 하는 기법
 외부에서 인스턴스 생성을 하지 못하도록 차단하고 
클래스 내에서 직접 인스턴스를 생성 후 외부로 리턴하는 기법
누구나 단 하나의 인스턴스만을 공유하여 사용해야함
즉, 외부에서 new를 통한 새 인스턴스 생성 불가능!
 
         

 

< 패 턴 규 칙 >

 1. 외부에서 인스턴스 생성이 불가능하도록 
    생성자에 private 접근 제한자를 선언하여 정의 (=> 외부에서 인스턴스 생성 못함)

 2. 자신의 클래스에서 직접 인스턴스를 생성하여 참조변수에 저장
    외부에서 인스턴스 생성 없이도 접근 할 수 있도록 static 키워드 사용
    외부에서 함부로 접근하지 못하도록 private 접근제한자 선언 
     
 3. 생성된 인스턴스를 외부로 리턴하는 GETTER 메서드 정의 
    => private 접근제한자로 선언된 멤버변수 instance 에 접근하여 
       생성된 인스턴스를 리턴하는 용도로 정의 
    => 인스턴스 생성 없이 호출해야 하므로 static 키워드 사용 
     


SingletonClass 클래스의 인스턴스 생성 

SingletonClass sc = new SingletonClass();
SingletonClass sc2 = new SingletonClass();


the constructor SingletonClass() is not visible
생성자가 private 접근제한자이므로 외부에서 호출 불가!
즉, 외부에서 인스턴스 생성이 차단됨!

클래스 내에서 인스턴스를 생성하여 멤버변수 instance 에 저장 했기 때문에
해당 변수를 통해 인스턴스를 가져 올 수 있다. 
=> 이 때, 해당 변수는 static 변수이므로 클래스명만으로 접근 가능함. 
SingletonClass sc = SingletonClass.instance; 
 
주의 ! SingletonClass 로부터 리턴 받은 인스턴스를 통해
클래스 내의 SingletonClass 타입 변수 instance에 접근이 가능하므로 
해당 변수 값을 변경할 우려가 있음.

 

 SingletonClass.instance = null;
 sc.instance = null;

외부에서 멤버변수에 함부로 접근하지 못하도록 private 접근제한자를 붙여서 외부 접근을 차단 

SingletonClass 내에서 싱글톤 디자인 패턴으로 생성된 인스턴스를 
변수 instance에 저장했으나, private 접근 제한자로 인해 접근 불가하므로
getInstance() 메서드 호출을 통해 주소값을 가져오기 
=> 이 때, getInstance() 메서드는 static 메서드 이므로 
 클래스명.메서드() 형태로 호출 가능
=> 즉, 인스턴스 생성 없이도 클래스 내의 메서드 호출 가능.

 

728x90
반응형

'BackEnd > Java' 카테고리의 다른 글

0926 JAVA - 상속 - 생성자  (0) 2022.09.26
0926 JAVA - 상속 is-a , has-a  (1) 2022.09.26
0922 JAVA - package ~ import 키워드  (0) 2022.09.22
0921 JAVA - PASS BY , this 키워드  (1) 2022.09.21
0921 JAVA - Variable  (1) 2022.09.21