싱글톤 패턴(Singleton Pattern)
싱글톤 패턴은 하나의 인스턴스만을 생성하여 어디서든 동일한 인스턴스를 사용하도록 보장하는 패턴으로,
자원을 효율적으로 관리하고 중복 생성을 방지하는 데 매우 유용합니다.
1. 싱글톤 패턴이란?
싱글톤 패턴은 이름 그대로 "단 하나의 인스턴스만을 갖는 객체"를 의미합니다.
자바에서는 클래스의 생성자를 private으로 선언하여 외부에서 직접 객체를 생성하지 못하도록 제한합니다.
그리고 클래스 내부에서 자체적으로 유일한 인스턴스를 생성하고,
외부에서는 이 인스턴스를 반환하는 정적 메서드를 통해 사용합니다.
이렇게 하면 어디서든 동일한 인스턴스에 접근할 수 있게 됩니다.
2. 싱글톤의 규칙
- private static 클래스 필드
- private 생성자
- public static 클래스타입 리턴하는 메서드
3. 싱글톤 패턴 구현 방법
public class Captain {
private static Captain instance = null; // (1)
// private 생성자 생성
private Captain () {} // (2)
// public static Captain타입을 리턴하는 메서드. (3)
public static Captain getInstance() {
if (instance == null) { // Captain타입으로 생성된 객체가 없으면 -> 인스턴스가 생성되지 않은 경우에
instance = new Captain(); // Captain타입 객체를 생성하고, 생성된 객체의 주소값을 instance에 저장
}
return instance; // Captain 타입 객체의 주소값을 리턴.
}
}
(1) private static Captain 타입의 필드
생성된 Captain 타입 객체의 주소 값을 저장하기 위한 필드.
- static으로 선언한 목적
- 프로그램 로딩 시점에 메서드 영역의 메모리에 미리 변수를 만들어 두기 위해서 static으로 선언합니다.
- private로 선안한 목적
- 필드의 값을 변경하는 것은 이 클래스 내부에서만 가능하도록 하기 위해서입니다.
(2) private 생성자
- 생성자를 private로 만드는 이유
- 다른 클래스에서 생성자를 호출할 수 없도록 하기 위해서 입니다.
(3) public static Captain 타입을 리턴하는 메서드
- public으로 선언하는 이유
- 다른 클래스에서 사용할 수 있도록 선언합니다.
- static인 이유
- Captain 타입 객체가 생성되기 전에도 호출할 수 있도록 하기 위해서 입니다.
3. 싱글톤 패턴 활용
싱글톤 패턴은 자원을 효율적으로 관리하거나, 로그 기록, 설정 정보, 캐시 등의 공유된 객체를 사용할 때 유용합니다.
또한, 외부 자원과의 연결을 단일화하여 중복 연결을 방지하는 데에도 활용될 수 있습니다.
public class Logger {
private static Logger instance;
private Logger() {}
public static Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
public void log(String message) {
// 로그 기록 코드 작성
}
}
위의 예시에서는 로그 기록을 담당하는 Logger 클래스를 싱글톤 패턴으로 구현하였습니다.
이제 어디서든 Logger.getInstance().log("로그 메시지");와 같이 로그를 기록할 수 있습니다.
4. 주의 사항
싱글톤 패턴은 남용될 경우 전역 상태를 유지하여 의존성이 높은 코드를 만들 수 있으므로 사용에 주의가 필요합니다.
또한, 멀티스레드 환경에서 동기화 문제를 주의하여야 합니다.
싱글톤 패턴은 자바 프로그래밍에서 많이 사용되는 디자인 패턴 중 하나로,
유일한 인스턴스를 보장하며 객체의 재생성을 방지하는데 유용합니다.
적절하게 사용한다면 자원을 효율적으로 관리하고 중복을 방지하여 프로그램의 효율성을 높일 수 있습니다.
잘못된 정보는 댓글로 알려주시면 감사하겠습니다.
'Java' 카테고리의 다른 글
Java - 29. 자바의 this 키워드 (0) | 2023.07.31 |
---|---|
Java - 28. 자바 상속(Inheritance) (0) | 2023.07.30 |
Java - 26. 자바의 인스턴스 멤버(Instance Member)와 스태틱 멤버(Static Member) (0) | 2023.07.28 |
Java - 25. 자바의 인스턴스(Instance) (0) | 2023.07.27 |
Java - 24. 자바의 객체(Object) (0) | 2023.07.26 |