
1. 싱글톤 패턴이란?
싱글톤 패턴은 어떤 클래스가 최초 한 번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하기 위한 패턴이다. 이를 통해 어떤 클래스에서든지 그 클래스의 인스턴스를 생성하고 접근할 수 있다.
static처럼 main 시작 전에 객체를 단 한번만 메모리 (heap)에 띄울 수 있는 패턴
(= 하나의 인스턴스를 공유하여 사용할 수 있음!)
(= heap은 원래 동적이라 내가 원할 때, 여러번 띄울 수 있는데 그걸 static처럼 사용)
클래스의 인스턴스를 단 하나만 생성하고, 어디서든 동일한 인스턴스에 접근할 수 있도록 하는 것
static이 용량을 많이 차지해서 싱글톤 패턴을 사용한다.
2. 싱글톤 패턴 구조
1. 생성자를 private으로 선언 > 외부에서의 인스턴스 생성을 막는다.
2. 클래스 내부에 정적(static) 메서드를 제공하여 유일한 인스턴스에 접근할 수 있게 한다.
3. 인스턴스가 생성되지 않았을 경우에는 인스턴스를 생성하고,
이미 생성되어 있는 경우에는 기존 인스턴스를 반환하는 방식으로 구현
(인스턴스(객체)를 반환하는 정적 메서드를 제공한다.)
이렇게 하면 해당 클래스의 인스턴스(객체)는 하나만 존재하게 되어, 어디서든지 그 인스턴스(객체)를 사용할 수 있다. 이 패턴을 사용하면 불필요한 인스턴스(객체) 생성을 막고, 메모리를 절약할 수 있다.
3. 싱글톤 예시
3-1. 원래 사용법

싱글톤을 사용하면 new를 한 번만 써서 코딩 할 수 있다.


당연하게 두 객체의 HASH값이 다른걸 확인! (다른 주소를 참조하고 있으니까
3-2. 싱글톤 사용
객체를 딱 한번만 메모리에 올릴 수 있는 패턴
- President p1 = new President(); 이렇게 하면
생성자에 접근을 못해 private니까
- 내가 new 할 수 있는 방법이 없다.
- 메인 시작 전에 한번 띄운다 --> 어디에?? heap에!! (메모리 공간이 다름)
메모리에 한번만 띄우고 싶으면 메인 시작전에 staic 으로 띄워도 되지만
싱글톤 패턴으로 --> heap에 띄우면서도 한번 띄울 수 있는 방법이 있구나!


코드
package ex04;
// 싱글톤 패턴
// 프레지던트르 메모리에 딱 한번만 띄울꺼다.
// President를 new를 한 번만 해!!
class President {
static President instance = new President();
// static 안 붙이면 이코드 절때 실행안됨
// static 붙이면 메인 실행 되기 전에 실행 됨
// 그때 new가 실행됨 메인 실행전 heap이 뜸
// 그리고 가리키는 주소는 instance
// instance 한테 접근하는 거다.
private President() {
}
}
public class SingleTonEx01 {
public static void main(String[] args) {
President p1 = President.instance; // 이렇게 객체를 가져옴, 인스턴스를 통해서 접근
System.out.println(p1.hashCode()); // hash 임의의 난수
President p2 = President.instance;
System.out.println(p2.hashCode());
// hashCode 임의의 난수
// 객체.해쉬코드
// 이 두 코드는 같다.
}
}
// 실행 값
793589513
793589513
main 메소드를 보면 new를 쓰지않고 객체를 만든 것을 확인!
p1과 p2는 동일함!
원래 ) President p1 = new President();
싱글톤 ) President p1 = President.instance;
>> instance 변수를 통해서 6번 라인에 접근
Hash 값이 같다!! 즉, 완벽하게 같은 걸 가리키고 있다는 말임!

4. Instance()메소드 / getInstance()메소드
싱글톤 디자인 패턴을 구현하는 메서드다
getInstance() 메서드는 싱글톤에서 유일하게 외부에서 객체를 얻는 방법 중 하나이다.
일반적으로 싱글톤 클래스의 생성자는
private으로 선언되어 외부에서 직접 객체를 생성할 수 없도록 한다.
따라서 getInstance() 메서드를 통해 싱글톤 객체를 얻을 수 있다.
이 메서드는 이미 생성된 싱글톤 객체가 있을 경우 해당 객체를 반환하고,
없을 경우에만 새로운 객체를 생성하여 반환한다.
이를 통해 애플리케이션 전체에서 하나의 공유 인스턴스를 유지할 수 있다.
5. 싱글톤을 사용하는 이유
1. 싱글톤을 사용하면 리소스를 단 하나의 인스턴스로 관리하여
충돌이나 부작용을 방지할 수 있다.
2. 메모리 절약이 가능하다 등
싱글톤은 해쉬값이 같지만 독립적이다.
a의 참조값을 바꾼다고 해서 레퍼런스 타입처럼 같이 값이 바뀌지 않는다는 말.
Share article