싱글톤 패턴이란?
소프트웨어 설계 패턴 중 하나이다.
클래스의 인스턴스가 하나만 생서오디도록 보장하며 해당 클래스의 인스턴스에 전역적 접근은 제공하지만 일관된 상태를 유지한다.
1) 사용목적
객체의 유일성을 보장, 자원을 절약을 위하여 사용한다.
2) 장점
자원의 중복생성을 방지하기 때문에 메모리사용에 있어서 최적화가 가능하며, 전역상태를 공유하고 통제된 접근을 할 수 있다.
3) 단점
전역 상태의 관리가 어려우며 다른 클래스에 영향을 끼칠 수 있다. (결합의 가능성이 존재하기 때문) 단, 테스트가 어렵다는 단점이 있다.
사용방법
1) 필드값: 반드시 static 으로 가진다 : 인스턴스화 없이 호출이가능하며 자원이 하나의 값을 가지기 때문이다.
private static Singleton instance;
2)생성자 : private로 지정한다. 즉, 외부에서 직접적인 인스턴스화가 불가능하도록 설정한다.
private Singleton() {};
3) 싱글톤 패턴의 전역 접근성을 제공하는 메서드를 정의한다.(여기서 인스턴스화를 담당)
- 주로 getInstance 메서드명을 사용한다.
public static Singleton getInstance(){
}
4)필드에 초기화 이전에는 아직 인스턴스화가되지 않은 것이다. 그래서 인스턴스를 진행하고 사용해야한다.
if (instance == null) {
instance = new Singleton(); // 인스턴스를 진행
}
return instance;
- if 조건문이 true라면 인스턴스화 된 객체를 반환한다
- if 조건문이 false라면 기존의 필드에 객체를 반환한다.
==> 즉 반드시 객체는 하나여야 한다.
싱글톤 패턴 사용 예제
class SchoolPrincipal {
// 유일한 객체를 저장할 변수
// : 클래스 그 자체의 객체값을 저장
private static SchoolPrincipal instance;
// 1. 생성자를 private으로 만들어 다른 곳에서 객체 생성이 불가하도록 설정
// >> 해당 클래스 외부에서 객체 생성 불가!
private SchoolPrincipal() {
System.out.println("교장 선생님 객체 생성!");
}
// 2. getInstance() 메서드를 통해 객체 생성
// >> 해당 클래스로 생성된 객체가 없는 경우에만 새롭게 생성하여 반환
public static SchoolPrincipal getInstance() {
if (instance == null) {
// 객체가 없다면 새로 생성
instance = new SchoolPrincipal();
}
return instance; // 기존 객체 OR 생성 객체 반환
}
public void announce() {
System.out.println("공부 열심히하고 운동 열심히하고 일찍 자고 일찍 일어나세요~~~");
}
}
public class D_Singleton {
public static void main(String[] args) {
// instance == null
// : 새로운 객체 생성
SchoolPrincipal principal1 = SchoolPrincipal.getInstance();
// 기존의 instance의 주소를 반환
SchoolPrincipal principal2 = SchoolPrincipal.getInstance();
SchoolPrincipal principal3 = SchoolPrincipal.getInstance();
SchoolPrincipal principal4 = SchoolPrincipal.getInstance();
System.out.println(principal1);
System.out.println(principal2);
System.out.println(principal3);
System.out.println(principal4);
System.out.println(principal1 == principal2); // true
principal1.announce();
}
}
'JAVA' 카테고리의 다른 글
Lombok(롬복) (1) | 2025.03.18 |
---|---|
Builder Pattern(빌더 패턴) (0) | 2025.03.17 |
Generic(제네릭) (0) | 2025.03.15 |
MVC 패턴 (0) | 2025.03.14 |
JAVA의 예외처리 (Throw/Throws) (1) | 2025.03.13 |