싱글톤 패턴이란
대표적인 디자인 패턴 중 하나로 한 클래스에 한 인스턴스를 가지는 패턴이다.
소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
- 출처 : 위키백과 - 싱글턴 패턴
생성된 인스턴스를 기반으로 다른 모듈에서 공유, 접근하여 사용할 수 있다.
주로 공통된 객체를 여러개 생성해서 사용하는 경우에 쓰이며
대표적으로 데이터베이스 연결 모듈 (DBCP) 가 있다.
싱글톤 패턴의 장점
이미 완성된 인스턴스를 기반으로 로직을 짜는 것이기 때문에 비용이 줄어든다.
static으로 별도로 고정 메모리 영역을 만든 뒤 인스턴스를 공유받아 쓰기 때문에 메모리 낭비가 줄어든다.
싱글톤 패턴의 단점
구체 클래스에 의존하기 때문에 모듈 간의 결합도가 높아질 수 있다.
의존성이 높아지면 개방-폐쇄의 원칙 (객체지향 설계 원칙) 에 어긋난다.
-> 객체 하나를 수정 할 때 해당 객체가 의존하는 다른 객체들까지 변경해버리면 매번 수정하기가 힘들게 된다.
단위테스트를 할 때 걸림돌이 된다.
-> 테스트 할 부분 이외의 코드는 격리한 채로 기능 단위를 테스트 해야 하는데 구체클래스와 결합도가 높아지면 분리하기가 힘들다.
싱글톤 패턴의 구현
1. new 연산자와 싱글톤 패턴 차이 구현하기
공공으로 대여해주는 서울자전거 따릉이와 개인 자전거 붕붕이가 있습니다.
따릉이는 여러대이기 때문에 여러명에게 대여해줄 수 있지만 (new 연산자)
붕붕이는 세상에 단 하나 뿐인 자전거기 때문에 최대 한 명에게만 대여해줄 수 있습니다. (싱글톤 패턴)
DdareungiBike.java
public class DdareungeiBike {
public DdareungeiBike() {
System.out.println("따릉이입니다");
}
}
new 연산자로 따릉이 자전거 인스턴스를 만들었습니다.
PersonalBike.java
public class PersonalBike {
private static PersonalBike bungbungi = new PersonalBike();
private PersonalBike() {
System.out.println("붕붕이입니다.");
}
public static PersonalBike getInstance(){
if (bungbungi == null){
bungbungi = new PersonalBike();
}
return bungbungi;
}
}
싱글톤 패턴으로 붕붕이 자전거 인스턴스를 만들었습니다.
이때 private 을 하면 오로지 getInstance를 통해서만 접근이 가능해집니다.
Test.java
public class Test {
public static void main(String[] args) {
DdareungeiBike man1 = new DdareungeiBike();
DdareungeiBike woman1 = new DdareungeiBike();
PersonalBike man2 = PersonalBike.getInstance();
PersonalBike woman2 = PersonalBike.getInstance();
}
}
따릉이를 빌리려는 남녀 2명과 붕붕이를 빌리려는 남녀 2을 호출했습니다.
결과 :
new 연산자를 두 번 호출하면 두 번의 인스턴스가 생성되지만
싱글톤을 두 번 호출하면 하나의 인스턴스만 생성됩니다.
2. new연산자와 싱글톤으로 생성된 객체의 차이 구현하기
위의 예제에서 생성된 객체는
man1 != woman1 이고 man2 == woman2 입니다.
즉, new 연산자로 생성된 객체는 서로 다르고
싱글톤으로 생성된 객체는 같습니다.
Test.java
public class Test {
public static void main(String[] args) {
DdareungeiBike man1 = new DdareungeiBike();
DdareungeiBike woman1 = new DdareungeiBike();
PersonalBike man2 = PersonalBike.getInstance();
PersonalBike woman2 = PersonalBike.getInstance();
if (man1 == woman1){
System.out.println("같은 따릉이입니다.");
} else {
System.out.println("다른 따릉이입니다.");
}
if (man2 == woman2){
System.out.println("같은 붕붕이입니다.");
} else {
System.out.println("다른 붕붕이입니다.");
}
}
}
결과 :
따릉이는 new 연산자를 통해 새로운 객체를 생성했기 때문에 객체가 다르고
싱글톤은 하나의 인스턴스를 통해 객체를 생성했기 때문에 객체가 같습니다.
'CS공부' 카테고리의 다른 글
MVC 패턴이란 (Model-View-Controller) (0) | 2023.06.29 |
---|---|
[JAVA] Enum(열거형) 개념과 예제 (0) | 2023.06.27 |
[JAVA] 큐(Queue) 클래스 및 메서드 총정리 (0) | 2023.06.23 |
[JAVA] 스택(Stack) 클래스 및 메서드 총정리 (0) | 2023.06.10 |
[알고리즘/JAVA] 에라토스테네스의 체 (0) | 2023.05.12 |