
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