싱글톤
하나만 생성된다고 해서 싱클톤이라고 한다. 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. 생성자를 호출한 만큼 객체가 생성되기 때문이다.
생성자를 외부에서 호출할 수 없도록 하려면 private 접근제한자를 붙여주면 된다.
private - 클래스 내부에서만 사용이 가능하다.
static - 내부에서 instance 변수, this 사용이 불가능하며 static변수만 사용가능하다. static는 클래스 로드될때 classArea에 초기화 된다.
package exOop;
class A {
int i;
private static A a1 = new A();
private A() {
i = 1;
}
public static A getInstance() {
return a1;
}
}
public class ExSingle {
public static void main(String[] args){
A a1 = A.getInstance();
//A a2 = A.getInstance();
System.out.println(a1.i);
System.out.println(a1);
}
}
위 코드를 그림으로 메모리 구조를 살펴보겠다.
ClassArea 에 A 타입의 a변수가 있다. static을 붙혔기 때문에 선언할 때에는 인스턴스변수의 경로가 아닌 곧바로 Class A에서 실행한다. 그렇지만 private 접근제한자를 붙여 외부에서 필드값을 변경하지 못하도록 하였기 때문에 외부에서 호출할 수 있는 정적 메서드인 getInstance() 를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.
예제
class Single{
//멤버변수
int i;
private static Single s = new Single();
private Single() { //외부에 노출되지 않음
i = 10;
}
public static Single getInstance() {
return s;
}
}
외부에 노출되지 않도록 private 접근제어자를 붙혔다.
앞서 말한 것처럼 getInstance() 는
외부에서 호출할 수 있는 정적 메서드인 getInstance() 를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴을 해준다.
public class SingletonTest {
public static void m1() {
Single s1 = Single.getInstance();
System.out.println("in main : s1정보값"+ s1);
s1.i = 99;
}
public static void m2() {
Single s1 = Single.getInstance();
System.out.println("in main : s1정보값"+ s1);
s1.i--;
}
public static void main(String[] args) {
Single s1 = Single.getInstance();
System.out.println(s1.i); //10
System.out.println("in main : s1정보값"+ s1);
m1();
System.out.println(s1.i); //99
m2();
System.out.println(s1.i); //98
}
}
직접 내부에 값을 변경하지 못하도록 하는 private 접근제어자의 특성이 있기때문에 위 코드와 같이 외부에 호출할 수 있는 메서드를 선언하고 그것을 s1의 변수에 담아 i 의 값을 집어넣을 수 있다.
정리
외부에서 호출하지 못하도록 막아야할 때 싱클톤 디자인 패턴을 사용할 수 있다. new연산자로 생성자를 호출할 수 없도록 하는데 private 접근 제어자를 붙이며 외부에서 호출할 수 있는 getInstance() 메서드를 선언하여 참조하고 있는 자신의 객체를 리턴해준다.
예약어 (접근제어자) & 캡슐화
https://float.tistory.com/manage/newpost/71?type=post&returnURL=https%3A%2F%2Ffloat.tistory.com%2F71
'java' 카테고리의 다른 글
java_8_ 상속 ( super와 this & 오버라이딩 ) (0) | 2021.10.19 |
---|---|
java_7_ 상속(Inheritance) & 다형성 (0) | 2021.10.18 |
java_7_예약어 (접근제어자) & 캡슐화 (0) | 2021.10.18 |
java_6_ static (0) | 2021.10.14 |
java_6_ 클래스 구성 (생성자) (0) | 2021.10.14 |