싱글톤패턴
싱글톤 패턴은 특정 클래스의 인스턴스를 하나만 생성하고, 이를 전역적으로 접근할 수 있도록 하는 디자인 패턴입니다. 주요 목적은 시스템 전체에서 공통된 리소스를 공유하거나, 객체 생성을 제한하여 메모리 낭비를 줄이기 위함입니다.
사전기반 지식
- 클래스와 객체 : 자바에서 클래스는 객체를 생성하기 위한 틀입니다. 일반적으로 하나의 클래스에서 여러 객체를 생성할 수 있지만, 싱글톤 패턴은 단 하나의 객체만을 보장합니다.
- 생성자(Constructor) : 객체가 생성될 때 호출되는 메서드로, 싱글톤 패턴에서는 생성자를 외부에서 호출하지 못하도록 제한합니다.
- 정적 변수와 메서드 : 싱글톤 패턴에서 주로 사용되는 정적(static) 멤버에 대한 이해가 필요합니다.
SingleTon 클래스
package singleton;
// 1. 정적 변수를 선언한다.
// 2. private 생성자를 선언한다.
// 3. 외부에서 접근할 수 있는 public 정적 메서드를 선언한다.
public class SingleTon {
// 1. 유일한 인스턴스를 저장할 변수를 선언한다. (private, static)
private static SingleTon instance;
// 2. 외부에서 객체를 생성 못 하도록 private 생성자를 선언한다.
private SingleTon() {}
// 3. 외부에서 인스턴스 주소를 반환 받을 수 있는 메서드를 선언한다.
// 심화 : 멀티 스레스 환경에서 안정하게 싱글톤 패턴을 구현 하기 위해서는
public static synchronized SingleTon getInstance() { // 동기화 처리
if (instance == null) {
instance = new SingleTon();
}
return instance;
}
}
MainTest
package singleton;
public class MainTest {
public static void main(String[] args) {
// 싱글톤 객체를 불러 와보자. !!
SingleTon systemSingleTon1 = SingleTon.getInstance();
SingleTon systemSingleTon2 = SingleTon.getInstance();
if (systemSingleTon1 == systemSingleTon2) {
System.out.println("같은 객체를 바라 보고 있습니다.");
}
}
}
- 싱글톤 패턴은 특정 클래스의 인스턴스를 하나만 유지하는 디자인 패턴입니다.
- 주로 공통된 리소스를 관리하거나, 전역 상태를 관리하는 데 사용됩니다.
- 장점: 메모리 절약, 전역적으로 동일한 인스턴스 사용
- 단점: 전역 상태로 인한 의존성 증가, 멀티스레드 환경에서의 동기화 이슈
- 로깅 시스템 : 여러 클래스에서 동일한 로깅 인스턴스를 사용하여 로그를 기록합니다.
- 설정 관리(Configuration) : 시스템의 설정 값을 저장하고, 이를 전역적으로 사용해야 하는 경우 싱글톤을 활용합니다
Connection 객체를 반환하는 클래스를 설계 한다. (단 멀티 스레드환경에 안전한 객체를 생성할 수 있도록 코드 작성)
public class DatabaseConnection {
// 데이터베이스 연결 코드
// 실제 데이터베이스 연결 객체 (예: JDBC Connection)
private Connection connection;
// 데이터베이스 URL, 사용자명, 비밀번호와 같은 설정
// JDBC 드라이버 로드
// Class.forName("com.mysql.cj.jdbc.Driver");
}
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
package singleton;
import java.sql.DriverManager;
import java.sql.Connection;
public class DatabaseConnection {
private static String URL = "jdbc:mysql://localhost:3306/testdb777?serverTimezone=Asia/Seoul";
private static String name = "root";
private static String password = "asd123";
private static Connection connection = null;
private DatabaseConnection() {}
public static Connection getConnection() {
if (connection == null) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(URL, name, password);
} catch (Exception e) {
e.printStackTrace();
}
}
return connection;
}
}
JAVA - 어댑터 패턴 (2) | 2024.09.26 |
---|---|
JAVA - 콜백 메서드 만들어 보기 (1) (1) | 2024.09.26 |
JAVA - 팩토리 패턴 (1) | 2024.09.26 |
S.O.L.I.D 원칙 (1) | 2024.09.25 |
JAVA - 람다식(Lambda expression) - 1 (1) | 2024.09.13 |