[자바] - 싱글톤 패턴

yeom yaloo·2023년 11월 27일
0

FISA

목록 보기
7/61
post-thumbnail

싱글톤 패턴

[비용 절감 효과를 코드로?]

  • 기업 입장에서는 비용 절감이 필요하다 이때 비용 절감의 예로 메모리를 낭비하지 않는 것이 가장 대표적인 예시이다.
  • 불필요한 객체를 강제적으로 개수 제한
  • 매일 실행되는 서버는 실행 속도 고려 필수
  • 설계가 중요하고, 개발 코드 실시간 효율적인 개발 가능한 튜닝이 필요하다.

1. 객체의 수를 강제로 조정하는 구조

  • 정형화된 구조 = 패턴
  • Singleton design pattern
  • 우리가 현재 사용하고 있는 여러 프레임워크들 내부에서는 이미 이 구조를 적용해서 객체를 한정적으로 생성
    해 공유하는 로직이 다수 존재한다.

[자바의 싱글톤 패턴]

1. static

  • 싱글톤 패턴의 경우엔 자바를 만든 사람들이 이를 기술하고 있을 정도로 중요한 개념이다.
  • 이를 이해하기 위해서는 자바에서의 static 키워드를 잘 알아두는 것이 중요하다.

1-1. 변수

  • 객체 생성 없이 호출이 가능하다.
  • Class.변수 구조로 호출한다.
  • 생성되는 모든 객체가 공유하는 데이터(변수)이다.

1-2. 메서드

  • 객체 생성 없이 메서드 호출이 가능하다.

1-3 static{ } (static block)

  • 모든 사용자가 공유하는 자원을 한번만 실행(자원 초기화)시에 주로 사용한다.
  • java 소스를 컴파일 후 생성되는 *.class 실행 코드인 바이트코드가 생성될 때, 메모리에 할당된다.

2. 싱글톤 패턴의 강제 사항

2-1. 생성자 호출은 외부 클래스에서금지

  • 생성사 호출을 외부 클래스에서 절대 금지하고 있는 것이 싱글톤 패턴의 특징이다.
  • 객체 생성은 해당 자신의 클래스(= 싱글톤 패턴을 적용한 클래스)에서 하나만 생성해서 해당 객체(싱글톤 패턴을 적용한 클래스)가 필요한 곳에 이미 생성된 객체를 공유하는 방법으로 객체 참조를 진행한다.

2-2. 생성자 호출을 막는 방법

  • 생성자의 접근제한자를 private로 범위 제한하여 외부에서 생성자 호출을 막는다.
    • 외부에서 해당 클래스를 생성하고 초기화할 때 사용하는 생성자에 접근할 수 없게 된다.

2-3. 싱글톤 패턴을 적용한 클래스의 객체 참조 하는 방법

  • public으로 해당 객체를 돌려주는 메서드를 만든다.
    • 생성자는 private, 객체를 돌려주는 메서드는 public으로 객체 생성은 막고 이미 생성된 객체를 공유하는 방법으로 진행한다.

[코드로 보는 싱글턴 적용 방법]

1. 코드


public class BizLogin {

	//(1)
	private final static BizLogin instance = new BizLogin();
	
	
	//(2)
	private BizLogin() {
	
	}
	
    //(3)
	public static BizLogin getInstance() {//멤버 변수로 생성된 객체 반환(객체의 주소값 반환)
		
		return instance;
		
	}
	
}

2. 코드 분석

  1. static 변수로 만들어 사용하는 이유?
  • static 키워드가 붙지 않으면 실제 메모리 생성 시점이 객체 생성 시점이 된다. 그러나 우리는 생성자를 private로 막아두었기 때문에 객체 생성전에 이미 생성되는 getInstance()에서 문제가 생기게 된다.
  • 이를 해결하기 위해서는 해당 변수 역시 static으로 만들어서 객체 호출 전에도 생성되게 해야 한다.
  1. private 생성자 메서드
  • 외부에서 생성자 호출을 하지 못하게 해서 객체 생성, 초기화를 막는 부분이다.
  1. static 메서드로
  • 해당 메서드는 싱글톤 패턴을 적용한 객체를 호출할 때 사용하는 메서드로 public으로 접근제한자를 열어두어야 한다.
  • 이때 static 키워드로 해당 메서드를 만든 이유는 생성자를 막아두었기 때문에 객체 생성이 불가해 해당 메서드를 사용하기 위해서는 객체 생성 없이 사용 가능한 static 메서드로 만들어 외부 클래스에서 해당 객체를 참조할 수 있게 하기 위함이다.

3. 정리

  • 외부에서 객체 생성을 막아두고 이미 만들어둔 객체를 외부에서 공유해서 사용할 수 있게 한다.
    • 이는 메모리 효율 측면에서의 비용 절감을 위한 방법이다.
  • 외부 클래스에서 객체 생성을 막아두기 위해서는 생성자의 접근제한자를 private로 막아두어야 한다.
  • 그렇다면 해당 객체 생성은 싱글톤 패턴을 적용한 클래스 내부에서 일어나야 한다.
    • BizLogin instance = new BizLogin();
  • 이때
profile
즐겁고 괴로운 개발😎

0개의 댓글