참고1 : https://jeong-pro.tistory.com/86
참고2 : https://commin.tistory.com/121
  • 회사 선배님들의 스프링 관련 토론(?)중, 지속적으로 싱글톤패턴에 대한 언급을 잘 못알아 들었다ㅜㅜ
  • 기본적인 디자인패턴 중 하나인데, 급급하게 공부한 입장에서 취업하고 이제서야 공부를 해보기 위한 포스팅
  • 싱글톤패턴에 대해 알아야 추후 스프링 빈 스코프(Singleton, prototype 등)와 관련하여 공부할 수 있다

1. 싱글톤패턴이 무엇?


  • 사전적 의미로는 낱개, 단독 개체 등의 의미가 있음
  • 기본적으로 인스턴스는 생성시마다 새롭게 메모리에 올라가서 생성
  • 싱글톤패턴은 최초에 한번만 클래스가 메모리에 올라간 후, 이후 인스턴스가 새롭게 생성되는게 아니라 최초에 생성된 인스턴스를 계속 돌려쓰게 됨

2. 싱글톤패턴 구현 방식


  • 기본생성자는 접근제어자가 public이지만, 싱글톤패턴에서는 private를 사용
  • private 기본생성자는 외부(자기 클래스 이외)에서 접근할 수 없기 때문에, new를 사용하는 기본 인스턴스 생성 방식을 사용할 수 없음
  • 최초 한 번을 생성하는 것은 내부에서 인스턴스를 생성해주고, getInstance()메서드를 사용하여 최초에 생성된 인스턴스를 계속 갖다 쓰는 방식

3. 코드 구현


  • Singleton.java
public class Singleton {
	
	private static Singleton singleton = new Singleton(); //최초 한 번만 인스턴스 생성
	
	private Singleton() { //접근제어자 private를 통해 외부에서 인스턴스 생성불가
		System.out.println("싱글톤 인스턴스입니다.");
	}
	
	public static Singleton getInstance() { //외부에서 인스턴스를 갖다 쓰기 위해 getInstance() 선언
		return singleton;
	}
}
  • SingletonMain.java
public class SingletonMain {
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
		Singleton singleton2 = Singleton.getInstance();
		
        //주소값 비교를 위해 두개의 인스턴스를 비교한다. 싱글톤이 구현되었다면, 두 주소값이 같을 것이다.
		System.out.println(singleton);
		System.out.println(singleton2); 
	}
}
  • SingletonMain.java의 실행결과
싱글톤 인스턴스입니다.
싱글톤패턴.Singleton@16f65612
싱글톤패턴.Singleton@16f65612

4. 언제 어디서 왜 사용?


1)장점

  • 인스턴스를 하나만 사용하기 때문에, 메모리 낭비를 방지할 수 있음
  • static으로 구현된 인스턴스이기 때문에, 다른 클래스들 간에 인스턴스들의 데이터 공유가 쉬움(DBCP 등에서 많이 사용)
  • 객체 로딩 시간 감소

2)단점

  • 싱글톤 패턴을 많이 사용하면, 다른 클래스들 간의 결합도가 높아져서 객체지향의 원칙인 ‘개방-폐쇄원칙’을 위배