싱글톤이란

  • 인스턴스를 한 개만 만들기
  • 클래스의 인스턴스가 단 하나만 필요한경우
  • 싱글톤 - 요소를 한개밖에 가지고 있지 않은 집합

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필드 초기화 되면서 인스턴스가 생성됨

싱글톤 인스턴스 생성 시점


연습문제

  1. 싱글톤 패턴 적용
  • 매번 객체 생성 코드
  • 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

싱글톤 예제 1

  1. 싱글톤 패턴이 아닌이유

다수의 스레드가 동시 실행되면 다수 인스턴스가 생성될 가능성이 있음

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

+ Recent posts