[JAVA] 디자인 패턴(Design patterns)::싱글톤(Singleton)::
@욕심쟁이
·2020. 9. 14. 18:10
반응형
디자인 패턴이란?
- 소프트웨어 개발시 자주 나타나는 구조나 방식, 패턴을 구체적이고 체계적으로 정의하여 모아둔 것
- 프로그래밍 형식을 정하는 일종의 약속
- 어떤 상황의 문제에 대한 해법
→ 프로그램머들이 옛날부터 문제된 코드들을 정리하여 해결할 수있도록 해놓은 해법
싱글톤 디자인 패턴(Singleton Design pattern)
- 프로그램에서 단 하나뿐인 유일한 객체(인스턴스)= 싱글톤 객체
→ 인스턴스가 오직 1개만 생성되어야 할때 사용
- 싱글톤 객체를 사용하여 프로그램을 작성하는 기법을 싱글톤 디자인 패턴이라고 함
- 새로운 인스턴스 생성을 불가능하게 하며, 미리 생성된 하나의 인스턴스를 모든 참조변수에서 공유해서 사용
<작성순서>
1. 객체가 생성되면 안되기 때문에 외부에서 생성자 호출을 못하도록 생성자 정의시 접근제한자를 private으로 선언
2. 자신의 클래스 내에서 직접 객체를 생성하여 참조변수에 저장
→ 참조변수의 접근제한자를 private으로 선언하여 접근제한 (생성자생성)
→ 참조변수를 static변수로 선언하여 객체생성없이 로딩(인스턴스 생성)
3. 생성된 인스턴스를 외부로 리턴하는 Getter를 정의
→ static변수를 리턴하므로 Getter메서드도 static으로 선언
예제1
public class Ex4 {
//접근제한자가 private이라 외부에서 인스턴스생성 불가능
//SingletonClass sc = new SingletonClass();
//SingletonClass sc2 = new SingletonClass();
//statice으로 선언된 정적 멤버변수 instance에 접근하여 미리 생성되어있는 인스턴스를 가져올 수 있다!
//=> 외부에서 함부로 값을 변경 할 수 없도록 private 접근제한자 적용
//SingletonClass sc = SingletonClass.instance;
//SingletonClass.instance = null; //함부로 값변경nono!
//외부에서 접근할 수 있도록 Getter메서드를 제공하므로
//Getter를 호출하여 생성된 인스턴스를 전달받아 사용할 수 있음
//=> static메서드인 getInstance()메서드를 호출하여 인스턴스 리턴
SingletonClass sc = SingletonClass.getInstance();
//참조변수sc2에도 동일한 인스턴스를 리턴받기
SingletonClass sc2 = SingletonClass.getInstance();
}
class SingletonClass{
//1. 생성자의 접근제한자를 private으로 선언하여
// 외부에서 인스턴스 생성을 못하도록(생성자 호출)을 못하도록 제한
private SingletonClass() {};
//2. 자신의 클래스내에서 직접 인스턴스를 생성하여 참조변수에 저장
//=> 이때, 인스턴스 생성이 불가능 하므로 인스턴스 변수 접근 불가능
// 따라서, 인스턴스 생성없이도 접근 가능하도록 static으로 선언
//=> 또한, 외부에서 변수에 접근하여 함부로 값을 변경하지 못하도록 접근제한자를 private으로 선언
private static SingletonClass instance = new SingletonClass();
//3. 인스턴스 생성 후 인스턴스가 저장된 멤버변수도 접근제한자로 인해 외부에서 접근이 불가능 하므로 대신 인스턴스를 리턴해주는 Getter메서드 정의(Setter 불필요)
//이때, 인스턴스 생성 없이도 호출가능하도록 static으로 선언
public static SingletonClass getInstance() {
return instance;
}
}
예제2
public class Test4 {
public static void main(String[] args) {
//생성된 인스턴스를 두번 가져오기
//SingletonTest st1 = new SingletonTest();//인스턴스 생성불가
SingletonTest st1 = SingletonTest.getInstance();
SingletonTest st2 = SingletonTest.getInstance();
System.out.println(st1.num+", " + st2.num);//10,10
st1.num = 100;
System.out.println(st1.num+", " + st2.num);//100,100
JavaTeacher jt = JavaTeacher.getInstance();
JavaTeacher jt2 = JavaTeacher.getInstance();
System.out.println(jt.i +", "+ jt2.i);//이순신, 이순신
jt.name = "이진";
System.out.println(jt.i +", "+ jt2.i); //이진, 이진
}
}
class SingletonTest{
//1. 생성자 생성
private SingletonTest() {}
// 2. 인스턴스 생성
private static SingletonTest instance = new SingletonTest();
//3. Getter정의
public static SingletonTest getInstance() {
return instance;
}
//싱글톤 패톤 객체확인을 위한 인스턴스 변수 1개 선언
int num = 10;
}
//2. JavaTeacher클래스정의 => 싱글톤 패턴 적용
class JavaTeacher{
//1. 생성자정의
private JavaTeacher() {};
//2. 인스턴스 생성
private static JavaTeacher instance = new JavaTeacher();
//3. Getter 정의
public static JavaTeacher getInstance() {
return instance;
}
//=================여기까지 싱글톤================================
String name = "이순신";
}
반응형
'IT > JAVA' 카테고리의 다른 글
[JAVA] Static 키워드 (0) | 2020.09.14 |
---|---|
[JAVA] 프로그램 실행 과정 (0) | 2020.09.14 |
[JAVA]추상클래스와 추상메서드(Abstract) (0) | 2020.09.11 |
[JAVA] INSTANCEOF 연산자 (0) | 2020.09.08 |
[JAVA] 형변환(기본형변환/참조형변환[upcasting/downcasting]) (0) | 2020.09.07 |