Java 싱글톤(Singleton) 패턴 - 인스턴스를 하나만 만드는 방법
코딩Java
읽는데 5분 소요
처음 쓰여진 날: 2026-02-17
마지막 수정일: 2026-02-17
조회수: 1
요약
Java 싱글톤(Singleton) 패턴의 개념과 동작 원리를 알아봅니다. static 변수로 인스턴스를 관리하고, 같은 객체를 공유하는 원리를 정보처리기사 실기 기출문제와 함께 정리합니다.
싱글톤 패턴 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 싱글톤 패턴 | 클래스의 인스턴스가 하나만 생성되도록 보장 | Gamja.get() |
| static 변수 | 클래스에 하나만 존재하는 공유 변수 | static private Gamja instance |
| 같은 객체 참조 | 여러 변수가 동일한 인스턴스를 가리킴 | s1, s2, s3 모두 같은 객체 |
| private 생성자 | 외부에서 new로 직접 생성하지 못하게 막음 | private Gamja() { } |
싱글톤 패턴이란?
싱글톤(Singleton) 패턴 은 클래스의 인스턴스(객체)가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다.
쉽게 말하면, "이 클래스로 만들 수 있는 객체는 딱 하나뿐" 이라는 규칙입니다.
java
코드 하이라이팅 중...
왜 하나만 만들까?
프린터, 설정 파일, 데이터베이스 연결처럼 하나만 있어야 하는 것들이 있습니다. 객체가 여러 개 만들어지면 충돌이 생길 수 있기 때문입니다.
시험에서는 '왜 쓰는지'보다 '어떻게 동작하는지'가 중요합니다
싱글톤 패턴의 사용 이유보다는 코드의 실행 흐름을 따라가서 출력 결과를 맞히는 것이 핵심입니다. get() 메서드가 어떻게 동작하는지, s1/s2/s3가 같은 객체인지를 파악하세요.
싱글톤 패턴 구조
기출문제에 출제된 싱글톤 패턴의 구조를 살펴보겠습니다.
java
코드 하이라이팅 중...
핵심 요소 3가지
| 요소 | 코드 | 역할 |
|---|---|---|
| static 변수 | static private Gamja instance = null; | 유일한 인스턴스를 저장하는 공간 |
| static 메서드 | static public Gamja get() { ... } | 인스턴스를 반환 (없으면 생성, 있으면 기존 반환) |
| 조건 검사 | if (instance == null) | 이미 만든 적 있는지 확인 |
static 키워드가 핵심입니다
instance 변수와 get() 메서드 모두 static으로 선언되어 있어서, 객체를 만들지 않고도 Gamja.get()으로 호출할 수 있습니다. static에 대해 더 자세히 알고 싶다면 static 키워드 페이지를 참고하세요.
get() 메서드 동작 원리
get() 메서드는 처음 호출할 때만 객체를 생성하고, 이후에는 기존 객체를 반환합니다.
처음 호출할 때 (instance == null)
java
코드 하이라이팅 중...
instance가null인지 확인 -> null이다 (아직 객체를 만든 적 없음)instance = new Gamja();-> 새 객체를 생성하여instance에 저장return instance;-> 새로 만든 객체를 반환s1이 이 객체를 가리킴
두 번째 이후 호출할 때 (instance != null)
java
코드 하이라이팅 중...
instance가null인지 확인 -> null이 아니다 (이미 객체가 있음)if블록을 건너뜀 (새 객체를 만들지 않음)return instance;-> 기존 객체를 그대로 반환s2도 s1과 같은 객체를 가리킴
text
코드 하이라이팅 중...
기출문제 풀어보기
21년 3회 기출 코드
java
코드 하이라이팅 중...
단계별 실행 추적
| 순서 | 코드 | instance | count | 설명 |
|---|---|---|---|---|
| 1 | s1 = Gamja.get() | 새 객체 생성 | 0 | null이므로 새로 만듦 |
| 2 | s1.count() | - | 1 | count 1 증가 |
| 3 | s2 = Gamja.get() | 기존 객체 반환 | 1 | null이 아니므로 기존 반환 |
| 4 | s2.count() | - | 2 | 같은 객체의 count 1 증가 |
| 5 | s3 = Gamja.get() | 기존 객체 반환 | 2 | null이 아니므로 기존 반환 |
| 6 | s3.count() | - | 3 | 같은 객체의 count 1 증가 |
| 7 | s1.getCount() | - | 3 | s1도 같은 객체이므로 3 반환 |
출력: 3
핵심 포인트
s1, s2, s3는 모두 같은 Gamja 객체를 참조합니다. 따라서 어떤 변수로 count()를 호출해도 같은 count 변수가 증가합니다.
만약 싱글톤이 아니었다면 (매번 new Gamja()로 새 객체를 만들었다면), 각 객체마다 count가 따로 있어서 결과는 1이 됩니다.
| 패턴 | s1.count | s2.count | s3.count | s1.getCount() |
|---|---|---|---|---|
| 싱글톤 (같은 객체) | 1 | 2 | 3 | 3 |
| 일반 (각각 다른 객체) | 1 | 1 | 1 | 1 |
시험 풀이 전략
싱글톤 패턴 확인하는 방법
코드에서 다음 3가지가 보이면 싱글톤 패턴입니다.
- static 변수에 자기 자신 타입 저장:
static private Gamja instance - null 검사 후 생성:
if (instance == null) instance = new Gamja(); - static 메서드로 반환:
static public Gamja get() { return instance; }
풀이 순서
- 싱글톤 패턴임을 확인 -> 모든 변수가 같은 객체를 참조
get()호출마다 같은 객체가 반환됨을 인지count++같은 연산이 누적됨을 추적- 최종
getCount()는 누적된 값을 반환
count() 호출 횟수만 세면 됩니다
싱글톤이라는 것을 파악하면, s1/s2/s3 구분 없이 count() 메서드가 총 몇 번 호출되었는지만 세면 정답을 구할 수 있습니다.