5-1. 싱글턴 패턴이란?
싱글턴은 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하는 생성 디자인 패턴입니다.


롤의 이 몬스터는 게임 시작 20분 후, 1마리만 등장한다고 한다.
2마리가 나와서는 안된다. 싱글턴 패턴이 적용된 것.
5-2. 예시 코드
ex01의 코드를 그대로 복사 붙여넣기 해서 ex04 폴더를 생성해 준다.
Animal
package ex04;
public abstract class Animal {
abstract String getName();
}
Mouse
package ex04;
public class Mouse extends Animal {
private String name = "쥐";
@Override
String getName() {
return name;
}
}
Tiger
package ex04;
public class Tiger extends Animal {
private String name = "호랑이";
@Override
String getName() {
return name;
}
}
여기까지는 동일
App에서 Doorman이 1번만 생성되도록 하려면 Doorman을 싱글턴 패턴으로 만들어줘야 한다.
- 아래와 같이 Doorman instance(변수)를 public으로 생성하면
- 메인에서 바로 Doorman.instance해서 인스턴스를 생성할 수 있다.
Doorman
package ex04;
public class Doorman {
// 이 방법으로 하면 getInstance 매서드를 만들 필요가 없다.
// static Doorman instance 가 private이 아니라 public 이라서 메인에서 바로 Doorman.instance로 인스턴스 생성할 수 있음
public static Doorman instance = new Doorman();
private Doorman() {}
public void 쫓아내(Animal a){
System.out.println(a.getName() + " 쫓아내");
}
}
App
package ex04;
/**
* Animal 생성 (abstract)
* 타입 일치(다형성) = 쥐(동물), 호랑이(동물)
* 문지기한테 dip만 지켜주면 됨
*/
public class App {
public static void main(String[] args) {
Doorman d1 = Doorman.instance;
Doorman d2 = Doorman.instance;
System.out.println(d1.hashCode());
System.out.println(d2.hashCode()); // hashCode 출력값이 동일
// hash 가 뭐지
// https://www.youtube.com/watch?v=HraOg7W3VAM
// 유튜브 보고 공부하기
}
}
hashCode의 출력값을 비교하면 동일하다 (싱글턴)

public인 경우 위처럼 하면 되고, 만약 Doorman instance(변수)가 private인 경우에는
외부에서 instance를 생성하기 위해 getInstance 매서드를 만들어 주면 된다.
Doorman
package ex04;
public class Doorman {
private static Doorman instance = new Doorman(); // jvm이 실행되면서 이 변수가 실행됨 (메인 시작전에 doorman 객체가 떠있음)
// doorman 변수가 static 메모리에 저장되고 우변의 new Doorman의 쫓아내 매서드가 heap에 뜸
public static Doorman getInstance(){ // static 메모리에 getInstance가 뜸 (메인 시작전에)
return instance;
}
// 상태(instance)를 행위(getInstance)를 통해 찾기 위해
// 위처럼 코드를 적었다.
private Doorman(){}
// 쥐 출입금지
public void 쫓아내(Animal a){
System.out.println(a.getName() + " 쫓아내");
}
}
App
package ex04;
/**
* Animal 생성 (abstract)
* 타입 일치(다형성) = 쥐(동물), 호랑이(동물)
* 문지기한테 dip만 지켜주면 됨
*/
public class App {
public static void main(String[] args) {
Doorman d1 = Doorman.getInstance();
Doorman d2 = Doorman.getInstance(); // new 두번 하는거 막기 (싱글톤 패턴)
System.out.println(d1);
System.out.println(d2);
}
}
d1과 d2의 값이 동일하다 (싱글턴)


Doorman에 static을 붙여줘서 main이 실행되기 전에 이 Doorman static 공간이 만들어진다.
그 안에는 doorman(코드에서는 변수 이름 instance로 바꿈)이 있고, (private 상태)
이 변수의 코드 한 줄이 실행되면서 new Doorman()을 하니까 heap 영역에 Doorman 인스턴스가
만들어지고, Doorman 클래스의 쫓아내 매서드가 heap 영역에 생긴다.
instance는 private라 접근이 불가능해 App에서 getInstance를 사용해서 instance를 소환한다.
물론 getInstance 매서드는 public이어야 한다.
추가) 해시 (Hash)

? ) 해시가 뭐지
Share article