[자바/JAVA] 싱글톤이란? 가장 많이 사용되는 싱글톤 작성방법에 대해 알아보자

박정현·2023년 9월 26일
0

🏠자바의 기초완성

목록 보기
20/23

싱글톤

1) 디자인패턴


  • 프로그래밍하는 일정 방식을 디자인 패턴이라 한다.
  • 공통, 표준화, 유지보수를 위한 목적이다.
  • 객체지향의 핵심이 설계도를 만들고 찍어내는 방식인데 설계도가 많아지므로 디자인패턴으로 만든다.
  • 디자인 패턴 중 하나로 싱글톤(Singleton)패턴이 있다
    • 객체(인스턴스)를 한 번만 생성
    • DAO(Datebase Access Object)를 위해 사용된다.
      • DB에 접근하여 일처리하는 객체를 말함
      • 대표적으로 CRUD 접근
    • 기본생성자의 접근 제한자가 pivate

2) 싱글톤패턴


  • 프로그램 시작부터 종료 시 까지 어떤 클래스의 인스턴스가 메모리상에 단 하나만 존재할 수 있게 하며 이 인스턴스에 대해 어디에서나 접근할 수 있도록 하는 패턴이다.
  • 객체(인스턴스)를 한 번만 생성한다.
  • 한 번만 객체를 생성해야 하는데 new를 사용하여 외부에서 호출하면 호출할 때마다 객체가 생성되므로 new를 사용하지 못하도록 해야 한다.
    • static필드 private으로 해서 외부에서 필드값을 바꿀 수 없도록 한다.
    • 대신 외부에서 호출할 수 있는 getInstance를 선언하고 자신의 객체를 리턴해 준다.
  • DAO(Datebase Access Object)를 위해 사용된다.
    • DB에 접근하여 일처리하는 객체를 말한다.
    • 대표적으로 CRUD 접근이 있다.
    • MVC Model2 → 싱글톤(Dao) → 객체를 한 번 생성
  • 기본생성자의 접근 제한자가 pivate
  • 내부클래스를 이용
  • static을 이용해서 외부에 접근
  • new 객체();
    • new할 때 마다 객체 생성하는데 싱글톤을 사용하면 한 번만 생성한다.

3) 싱글톤 작성방법

① 기본

public class Singleton {

   //정적필드
   private static Singleton instance= new Singleton );
   //생성자
   private Singleton { 
	  // 생성자는 외부에서 호출하지 못하도록 private으로 지정	
	}
   //정적메소드
   static Singleton getInstance( ) {
      return instance;
   }

}
  1. 클래스 외부에서 new연산자를 통해 생성자 호출하는 것이 불가하도록 private접근 제한자 사용한다.

    → 전체에서 하나만 만들어야되기 때문에 새로운 객체를 만들지 못하도록 해야 함

  2. 자신의 타입인 정적 필드 선언 후 자신의 객체 생성해 초기화

    필드 영역에: private static 클래스 singleton = new 클래스( );

    생성자 영역에: private 클래스( ) { }

  3. 외부에서 호출할 수 있는 getInstance( ) 선언

    메소드 영역

    static 클래스 getInstance( ) {
    return.sigleton;
    }

    외부에서 클래스 변수1 = 클래스.getInstnace();로 호출할 수 있음

  4. 정적 필드에서 참조하는 자신의 객체 리턴

    getInstance();로 호출하면 모두 new클래스(); 객체를 참조하기 때문에 새로운 getInstnace();를 만들어도 같은 객체를 참조함

② **Bill Pugh Singleton Implementaion**

현재 가장 많이 사용되고 있는 싱글톤 구현 방법이다.

public class Singleton {
 
    private Singleton(){}
    
    private static class SingletonHelper{
        private static final Singleton INSTANCE = new Singleton();
    }
    
    public static Singleton getInstance(){
        return SingletonHelper.INSTANCE;
    }
}

5) 싱글톤 사용이유


  1. 메모리 측면

    최초 한 번의 new연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체의 접근할 때 메모리 낭비를 방지할 수 있다. 또한 이미 생성된 인스턴스를 활용하므로 속도측면에서도 이점이 있다.

  2. 데이터 공유

    싱글톤 인스턴스가 전역으로 사용되는 인스턴스이므로 외부 클래스의 인스턴스들이 접근하여 사용할 수 있다.

    그러나 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터를 동시에 접근하면 동시성의 문제가 발생할 수 있으므로 유의해서 사용해야 한다.

profile
개발을 개발괴발하지 않기 위한 노력

0개의 댓글