[JAVA/디자인패턴] 싱글톤(singleton) 패턴

DANI·2023년 9월 21일
0

JAVA를 공부해보자

목록 보기
1/29
post-thumbnail

📖 싱글톤 패턴이란?

✅ 단 하나의 객체만을 생성하게 강제하는 디자인 패턴. 즉, 클래스를 통해 생성할 수 있는 객체가 한 개만 되도록 만드는 것

✅ 어플리케이션이 시작될 때 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴

✅ 실제로 생성되는 객체는 하나이며 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환시키는 것

즉, 한 개의 객체만 생성하여 해당 인스턴스를 공유하여 사용할 수 있게 하여 설정값 변경등에 혼동이 없도록 도와줌


❓ 싱글톤 패턴의 사용 이유

✅ 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 어디에서든 공유하며 접근, 사용할 수 있도록 함

✅ 주로 공통된 객체를 여러개 생성해서 사용해야 하는 상황에 사용

✅ 하나의 인스턴스 메모리에 등록해서 여러 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있게끔 할 수 있기 때문에 요청이 많은 곳에서 사용하면 효율을 높일 수 있음


❓ 싱글톤 패턴의 장점

  1. 인스턴스가 하나이기 때문에 메모리 낭비를 줄일 수 있다.
  2. 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
  3. 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용
  4. 두 번째 이용시 부터는 객체 로딩 시간이 줄어 성능이 좋아짐
  5. DBCP(DataBaseCommection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용됨

❓ 싱글톤 패턴의 단점

  1. 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생.
  2. 어플리케이션 전역에서 상태를 공유하기 때문에 해당 패턴을 테스트하려면 격리된 환경에서 수행하여야 함. 또한, 매번 인스턴스의 상태를 초기화시켜주어야하기 때문에 테스트하기 어렵다.
  3. 자식클래스를 만들수 없다는 점과, 내부 상태를 변경하기 어렵다.

🔴 싱글톤 패턴 생성하기 1

public class SingleTon {

	// 다른 클래스에서 생성할 수 없도록 생성자를 private으로 생성함!
	private SingleTon() {
	}
	
	// static 선언으로 지정된 메모리 공간에만 존재하는 변수 선언
	private static SingleTon one;
	
	// one이 null 이면 새로운 객체 생성, null이 아니면 그대로 반환
	public static SingleTon getInstance() {
		if(one==null) {
			one = new SingleTon();
		}
		return one;
	}
}

🔴 메인 메소드

package java_studying;

public class SingleTonSample {

	public static void main(String[] args) {
    	
        // singletone 변수로 SingleTon타입 인스턴스를 불러옴
		SingleTon singletone = SingleTon.getInstance();
      
        // singletone1 변수로 SingleTon타입 인스턴스를 불러옴
		SingleTon singletone1 = SingleTon.getInstance();
		
        // 두 변수가 같다면 같은 객체, 다르다면 다른 객체
		if(singletone==singletone1) {
			System.out.println("두 객체는 같습니다.");
		} else {
			System.out.println("두 객체는 다릅니다.");
		}	
	}
}

🔵 결과값

두 객체는 같습니다.

🔴 싱글톤 패턴 생성하기 2

public class SingleTon1 {
	
	// 다른 클래스에서 생성할 수 없도록 private으로 생성자 선언
	private SingleTon1() {
	}
	
	// private static class에 final(변경할 수 없음)로 변수이름이 one인 싱글톤 객체를 생성함
	private static class LazyHolder{
		public static final SingleTon1 one = new SingleTon1();
	}
	
	// LazyHolder의 final로 선언된 변수 one을 반환해줌
	public static SingleTon1 getInstance() {
		return LazyHolder.one;
	}
}

🔴 메인 메소드

package java_studying;

public class SingleTonSample {

	public static void main(String[] args) {
    	
        // singletone 변수로 SingleTon1타입 인스턴스를 불러옴
		SingleTon1 singletone = SingleTon1.getInstance();
      
        // singletone1 변수로 SingleTon1타입 인스턴스를 불러옴
		SingleTon1 singletone1 = SingleTon1.getInstance();
		
        // 두 변수가 같다면 같은 객체, 다르다면 다른 객체
		if(singletone==singletone1) {
			System.out.println("두 객체는 같습니다.");
		} else {
			System.out.println("두 객체는 다릅니다.");
		}	
	}
}

🔵 결과값

두 객체는 같습니다.

0개의 댓글