<CS 지식> 싱글톤 패턴 (Singleton Design Pattern)

Google 아니고 Joogle·2022년 7월 23일
0

CS 지식

목록 보기
12/22
post-custom-banner

1. Singleton Pattern?

  • 여러 개의 객체가 필요 없는 경우
  • 객체를 구별할 필요가 없는 경우. 즉, 수정 가능한 멤버 변수가 없고, 기능만 있는경우
  • 객체를 계속 생성/삭제하는데 많은 비용이 들어서 재사용이 유리한 경우

2. 싱글톤 패턴 사용의 이점

  • 최초 한 번의 new 연산자를 통해서 고정된 메모리를 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있음
  • 이미 생성된 인스턴스를 활용하니 속도 측면에서 이점이 있음
  • 클래스간 데이터 공유가 쉬움

3. 싱글톤 패턴 사용의 문제점

  • 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제 발생
  • 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우에 멀티스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 함
  • 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 해주어야 함
  • 클라이언트가 구체 클래스에 의존하게 되므로, SOLID 원칙 중 DIP(의존성 역전원칙)를 위반 하게 됨

4. 구현 방법

  • 외부에서 생성자에 접근을 하지 못하게 생성자의 접근 제한자를 private로 설정
  • 내부에서는 private에 접근 가능하므로 직접 객체를 생성
  • 외부에서 private member에 접근 가능한 getter 생성 (setter는 불필요)
  • 객체없이 외부에서 접근할 수 있도록 getter에 public static 추가
  • 외부에서는 언제나 getter를 통해 객체를 참조하므로 하나의 객체 재사용

5. 구현 코드

package oop.singleton;

public class SingletonClass {
	
	//#2. 내부에서는 private에 접근 가능하므로 직접 객체를 생성 -> 객체는 오직 내부에서 1개 
	private static SingletonClass sc=new SingletonClass();
	
	//#1. 외부에서 생성자에 접근 금지 -> 접근 제한자를 private로 설정
	private SingletonClass () {}
	
	//#3. 외부에서 private 멤버에 접근 가능한 getter 생성
	//#4. 객체없이 외부에서 접근할 수 있도록 getter 변수에 public static 추가
	public static SingletonClass getSingletonClass () {
		return sc;
	}
	
	public void sayHello() {
		System.out.println("Hello");
	}
	
}
package oop.singleton;

public class SingletonTest {

	public static void main(String[] args) {
		SingletonClass sc1=SingletonClass.getSingletonClass();
		sc1.sayHello();
		
		SingletonClass sc2=SingletonClass.getSingletonClass();
		sc2.sayHello();
		
		//#5. 외부에서는 언제나 getter를 통해 객체를 참조하므로 하나의 객체 재사용
		System.out.println(sc1==sc2);

	}

}

메인 메소드에서 sc1과 sc2가 참조하는 객체는 같으므로 s1==s2

Reference
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/

profile
Born to be happy, Not perfect 🤍
post-custom-banner

0개의 댓글