싱글톤이란
- 인스턴스를 한 개만 만들기
- 클래스의 인스턴스가 단 하나만 필요한경우
- 싱글톤 - 요소를 한개밖에 가지고 있지 않은 집합
Singleton 클래스
- 인스턴스를 1개 밖에 만들수 없음
- static 필드로서 Singleton클래스의 인스턴스에서 초기화됨 (Singleton 클래스 로드시 1회만 실행)
- 생성자는 private로 되어있음
- 왜? 외부에서 생성자의 호출을 금지하기 위해서
- 만약 new로 한다면 ? 싱클돈 패턴이 아님 (싱글톤은 클래스에서 단 하나의 인스턴스만 존재하는 것이기 때문)
싱글톤 예제
요소 설명
- - : Singleton이 private임
-
밑줄 : 메소드가 static 메소드임

[ static 란? ]
전역, 정적 이라고함
해당 데이터의 메모리 할당을 컴파일 시간에 하는것
런타임중 필요할때마다 동적으로 메모리를 할당 하는 것이아니라 데이터는 프로그램 실행 직후부터 끝날 때까지 메모리 수명이 유지
- static: 변수인스턴스 간에 데이터 공유가 필요한 상황
- static final: 클래스 내부 또는 외부에서 참조의 용도로만 선연
- static 메소드: 인스턴스를 생성하지 않아도 static 메소드 호출 가능
- public static void main: 자바에서 메인 메소드 실행할때 사용인스턴스의 생성과 상관없이 JVM에 의해 호출되므로 static무조건 선언 해야함 cf ) final 변수한번 값이 결정되었다면 변경이 불가능
- final 클래스: 상속을 허용하지 않음
- final 메소드: 오버라이딩을 허용하지 않음
소스 코드
- 정말 같은 메모리를 사용하는 것인지 확인하기위한 예제
- Main.java
package Singleton;
public class Main {
public static void main (String[] str) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if(s1==s2) {
System.out.println("같음");
System.out.println(s1);
System.out.println(s2);
} else {
System.out.println("다름");
}
}
}
- Singleton.java
package Singleton;
public class Singleton {
// static 프로그램 실행전에 하나메모리에 할당해서 끝날때까지 유지가됨
// 왜 static인가? 외부에서 호출하는것을 금지하기위해 -> 싱글톤이라는 의미는 해당 클래스에서 인스턴스가 딱 한개만 존재하는것
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("인스턴스 생성");
}
public static Singleton getInstance() {
return singleton;
}
}

Singleton각각의 역할
-
Singleton 패턴에는 Singleton의 역할만 존재
⇒ 유일한 인스턴스를 얻기 위한 static 메소드를 가짐 (언제나 동일한 인스턴스 반환)
왜 사용하는가?
- 싱글톤 패턴은 인스턴스 수를 제한함으로서 복수의 인스턴스가 존재하면 서로 영향을 미치고 뜻하지 않는 버그가 발생할 수 있기에 인스턴스가 1개만 있다 라고 보증 하는 것이다
싱글톤에서 인스턴스 생성시점
- 프로그램 실행후 인스턴스를 얻는 함수 호출하면 static필드 초기화 되면서 인스턴스가 생성됨

연습문제
- 싱글톤 패턴 적용
- 매번 객체 생성 코드
- TicketMater.java
package Singleton;
public class TicketMater {
private static TicketMater ticketMater = new TicketMater();
private static int ticket = 100;
public static int getNextTicket() {
return ticket++;
}
public static TicketMater getInstance() {
return ticketMater;
}
}
for(int i=0 ;i<10;i++) {
int ticketMater = TicketMater.getNextTicket();
System.out.println(TicketMater.getInstance() +"||" +ticketMater);
}
- result

- 싱글톤 패턴이 아닌이유
다수의 스레드가 동시 실행되면 다수 인스턴스가 생성될 가능성이 있음
solv1 ) 복수 인스턴스 생성을 막기위해 sleep 추가
- Singleton.java
private static Singleton singleton = null;
private Singleton() {
System.out.println("create");
slowdown();
}
public static Singleton getInstance( ) {
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
private void slowdown() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
solv2 ) 동기화를 이용해 엄격한 싱글톤 패턴 적용
- Singleton.java
private static Singleton singleton = null;
private Singleton() {
System.out.println("create");
slowdown();
}
public static synchronized Singleton getInstance( ) {
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
private void slowdown() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
synchronized 란?
- 자바로 프로그래밍 하다보면 멀티 스레드가 발생해서 동기화를 제어해야하는 상황이 생김
- 동시성을 제어
'Study(Language)' 카테고리의 다른 글
[Design Pattern] FactoryMethod Pattern (0) | 2021.01.04 |
---|