싱글톤 패턴

Jemin·2023년 9월 25일
0

백엔드

목록 보기
12/21
post-thumbnail

싱글톤

싱글톤 패턴(Singleton Pattern)은 객체지향 디자인 패턴 중 하나로, 특정 클래스의 인스턴스가 단 하나만 생성되고 어디서든지 그 인스턴스에 접근할 수 있도록 하는 패턴이다.

특징

  • 유일한 객체: 싱글톤 패턴을 사용하면 특정 클래스의 인스턴스가 오직 하나만 존재하도록 보장된다. 즉, 여러 요청 또는 스레드에서 해당 객체를 공유할 수 있다.

  • 전역 접근: 어디서든지 해당 싱글톤 객체에 접근할 수 있다. 다른 객체에서 해당 싱글톤 객체를 참조하여 작업을 수행할 수 있다.

사용하는 이유

싱글톤 패턴을 사용해서 얻을 수 있는 가장 먼저 떠오르는 이점은 아무래도 메모리 측면이다. 최초 한 번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.

또 다른 이점은 다른 클래스 간에 데이터 공유가 쉽다는 것이다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다. 하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 이점을 유의해서 설계하는 것이 좋다.

코드 예제

class singleton {
	private singleton() {
    }
}

public class Sample {
	public static void main(String[] args) {
    	Singleton singleton = new Singleton(); // 컴파일 오류가 발생한다.
    }
}

위 같이 코드를 작성하면 컴파일 오류가 발생한다. 왜냐하면 Singleton 클래스의 생성자가 private 접근 제어자를 설정하여 다른 클래스에서 Singleton 클래스의 생성자로의 접근을 막았기 때문이다. 이렇게 생성자를 private으로 만들어 버리면 Singleton 클래스를 다른 클래스에서 new를 이용하여 생성할 수 없게 된다.

new를 이용하여 무수히 많은 객체를 생성한다면 싱글톤의 정의에 어긋나기 때문에 일단 new 객체로 생성할 수 없도록 막은 것이다.

그렇다면 Singleton 클래스의 객체는 어떻게 생성할 수 있을까?

class Singleton {
    private Singleton() {
    }

    public static Singleton getInstance() {
        return new Singleton();  // 같은 클래스이므로 생성자 호출이 가능하다.
    }
}

public class Sample {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
    }
}

위 코드처럼 getInstance라는 스태틱 메서드를 이용하여 Singleton 클래스 객체를 생성할 수 있다. 하지만 getInstance를 호출할 때마다 새로운 객체가 생성되기 때문에 이 역시 싱글톤이 아니다.

class Singleton {
    private static Singleton one;
    private Singleton() {
    }

    public static Singleton getInstance() {
        if(one==null) {
            one = new Singleton();
        }
        return one;
    }
}

public class Sample {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);  // true 출력
    }
}

Singleton 클래스에 one이라는 static 변수를 작성하고, getInstance 메서드에서 one값이 null인 경우에만 객체를 생성하도록 하여 one 객체가 딱 한 번만 만들어지도록 했다.

처음 getInstance가 호출되면 one이 null이므로 new에 의해서 one 객체가 생성된다. 이렇게 한 번 생성되면 one은 static 변수이기 때문에 그 이후로는 null이 아니다. 이어서 다시 getInstance 메서드가 호출되면 이미 만들어진 싱글톤 객체인 one을 항상 리턴한다.

참조
스태틱 - 점프 투 자바
싱글톤(Singleton) 패턴이란?

profile
경험은 일어난 무엇이 아니라, 그 일어난 일로 무엇을 하느냐이다.

0개의 댓글