6.15 싱글톤 패턴 (유일한 객체)
6.15.1 싱글톤(Singleton)이란?
“우리 회사의 CEO는 단 한 명뿐입니다.”
프로그램 전체에서 단 하나의 객체만 생성해서 공유하고 싶을 때 사용하는 디자인 패턴입니다.
비유: 회사의 CEO
- 직원(일반 객체): 필요할 때마다 계속 채용(생성)할 수 있습니다.
- CEO(싱글톤): 회사에 딱 한 명만 존재해야 합니다. 만약 CEO가 두 명이라면 회사가 혼란에 빠질 것입니다.
6.15.2 싱글톤 만들기 (CEO 집무실 만들기)
싱글톤을 만드는 핵심은 “외부에서 마음대로 생성(new)하지 못하게 막는 것”입니다.
💻 코드 예시
public class Singleton {
// 1. 자기 자신을 나타내는 단 하나의 객체 (CEO 본인)
// private static으로 선언하여 외부 접근을 막고, 클래스 로딩 시 딱 한 번만 생성됨
private static Singleton singleton = new Singleton();
// 2. 생성자를 private으로 막기 (채용 공고 내리기)
// 외부에서 'new Singleton()'을 호출할 수 없게 됨
private Singleton() {}
// 3. 외부에서 접근할 수 있는 유일한 통로 (비서실)
public static Singleton getInstance() {
return singleton;
}
}
🔍 코드를 다시 한번 원리와 동작을 살펴봅니다
private static필드: 자신의 객체를 딱 하나만 만들어서singleton변수에 담아둡니다.static이므로 메모리에 딱 한 번만 올라갑니다.private생성자: 생성앞에private을 붙이면 외부 클래스에서new Singleton()을 호출했을 때 컴파일 에러가 발생합니다. 즉, 외부에서는 객체를 만들 수 없습니다.public static getInstance(): 외부에서 CEO를 만날 수 있는 유일한 방법입니다. 이 메소드를 호출하면 미리 만들어둔singleton객체를 리턴해줍니다.
6.15.3 싱글톤 사용하기
외부에서는 new 대신 getInstance() 메소드를 사용해야 합니다.
💻 코드 예시
public class SingletonExample {
public static void main(String[] args) {
// Singleton obj1 = new Singleton(); // (X) 컴파일 에러! 생성자 호출 불가
// 올바른 사용법: getInstance() 호출
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
// 두 변수가 같은 객체를 가리키는지 확인
if (obj1 == obj2) {
System.out.println("같은 CEO입니다.");
} else {
System.out.println("다른 사람입니다.");
}
}
}
🔍 코드를 다시 한번 원리와 동작을 살펴봅니다
- 실행 결과:
같은 CEO입니다.가 출력됩니다. -
참조값 비교:
obj1과obj2는 완전히 동일한 주소(메모리 위치)를 가리키고 있습니다. 즉, 객체는 하나뿐이고 변수 두 개가 그 하나를 바라보는 것입니다.
6.15 싱글톤 패턴 (유일한 객체)
6.15.1 싱글톤(Singleton)이란?
“우리 회사의 CEO는 단 한 명뿐입니다.”
프로그램 전체에서 단 하나의 객체만 생성해서 공유하고 싶을 때 사용하는 디자인 패턴입니다.
비유: 회사의 CEO
- 직원(일반 객체): 필요할 때마다 계속 채용(생성)할 수 있습니다.
- CEO(싱글톤): 회사에 딱 한 명만 존재해야 합니다. 만약 CEO가 두 명이라면 회사가 혼란에 빠질 것입니다.
6.15.2 싱글톤 만들기 (CEO 집무실 만들기)
싱글톤을 만드는 핵심은 “외부에서 마음대로 생성(new)하지 못하게 막는 것”입니다.
💻 코드 예시
public class Singleton {
// 1. 자기 자신을 나타내는 단 하나의 객체 (CEO 본인)
// private static으로 선언하여 외부 접근을 막고, 클래스 로딩 시 딱 한 번만 생성됨
private static Singleton singleton = new Singleton();
// 2. 생성자를 private으로 막기 (채용 공고 내리기)
// 외부에서 'new Singleton()'을 호출할 수 없게 됨
private Singleton() {}
// 3. 외부에서 접근할 수 있는 유일한 통로 (비서실)
public static Singleton getInstance() {
return singleton;
}
}
🔍 코드를 다시 한번 원리와 동작을 살펴봅니다
private static필드: 자신의 객체를 딱 하나만 만들어서singleton변수에 담아둡니다.static이므로 메모리에 딱 한 번만 올라갑니다.private생성자: 생성앞에private을 붙이면 외부 클래스에서new Singleton()을 호출했을 때 컴파일 에러가 발생합니다. 즉, 외부에서는 객체를 만들 수 없습니다.public static getInstance(): 외부에서 CEO를 만날 수 있는 유일한 방법입니다. 이 메소드를 호출하면 미리 만들어둔singleton객체를 리턴해줍니다.
6.15.3 싱글톤 사용하기
외부에서는 new 대신 getInstance() 메소드를 사용해야 합니다.
💻 코드 예시
public class SingletonExample {
public static void main(String[] args) {
// Singleton obj1 = new Singleton(); // (X) 컴파일 에러! 생성자 호출 불가
// 올바른 사용법: getInstance() 호출
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
// 두 변수가 같은 객체를 가리키는지 확인
if (obj1 == obj2) {
System.out.println("같은 CEO입니다.");
} else {
System.out.println("다른 사람입니다.");
}
}
}
🔍 코드를 다시 한번 원리와 동작을 살펴봅니다
- 실행 결과:
같은 CEO입니다.가 출력됩니다. - 참조값 비교:
obj1과obj2는 완전히 동일한 주소(메모리 위치)를 가리키고 있습니다. 즉, 객체는 하나뿐이고 변수 두 개가 그 하나를 바라보는 것입니다.
6.15.4 왜 싱글톤을 쓸까요?
- 메모리 절약: 객체를 매번 새로 만들지 않고 하나를 계속 쓰니까 메모리가 낭비되지 않습니다.
- 데이터 공유: 전역(Global)에서 사용되는 설정 정보나, 데이터베이스 연결 객체처럼 모두가 공유해야 하는 데이터를 관리할 때 유용합니다.
코딩 영단어 학습 📝
코딩에서 영어 단어의 의미만 정확히 이해해도 절반은 성공입니다! 오늘 배운 핵심 영단어들을 다시 한번 짚고 넘어가 볼까요?
Singleton: 싱글톤. (프로그램 전체를 통틀어 단 하나만 유일하게 존재해야 하는 특별한 객체를 만들 때 사용하는 전 국민 공유 객체 생성 기법)Pattern: 패턴. (코딩을 하다 보니 자주 마주치는 뻔한 문제들을 쉽고 우아하게 해결하기 위해 선배 개발자들이 정립해 놓은 모범적인 코드 작성 뼈대나 공식)
이전 학습
« 9.14 Getter와 Setter
다음 학습
9.16 레코드 패턴 »
서브목차