[Java] 싱글톤과 정적 메서드 비교하기

김현수·2024년 3월 30일
0

WEB

목록 보기
15/18
post-thumbnail

🖋️ 싱글톤과 정적 메서드 비교


  • Static Method (무상태 유틸리티 함수)

    • 상태 비저장

      • 한 호출에서 다른 호출까지 어떤 상태도 유지 X
      • 클래스 인스턴스의 상태와는 독립적으로 작동
    • 액세스

      • 클래스 인스턴스가 아닌 클래스 자체에서 직접 액세스
      • 정적 메서드를 사용하기 위해 클래스에서 개체를 만들 필요 없음
    • 인스턴스 값

      • 정적 메서드는 클래스 인스턴스에서 작동 불가
      • 인스턴스 값(예: 비정적 속성 또는 메서드)에 직접 액세스 불가능
      • 정적 속성에만 액세스
public class MathUtils {
    // A static method that adds two numbers
    public static int add(int a, int b) {
        return a + b;
    }
    
    // A static method that multiplies two numbers
    public static int multiply(int a, int b) {
        return a * b;
    }
}

// Usage without creating an instance
int sum = MathUtils.add(5, 3); // 8
int product = MathUtils.multiply(4, 2); // 8

System.out.println("Sum: " + sum);
System.out.println("Product: " + product);

  • 싱글톤 (단 하나의 상태를 전역 관리)

    • 상태 저장

      • 싱글톤은 상태를 유지
      • 애플리케이션의 수명 주기 전체에 걸쳐 싱글톤 클래스의 인스턴스는 하나만 있으므로 애플리케이션의 여러 부분에서 지속되는 상태를 유지하고 수정
    • 제어된 액세스

      • 인스턴스가 하나만 생성되도록 하는 정적 메서드를 통해 개체 생성을 제어
      • 그런 다음 이 단일 인스턴스를 사용하여 인스턴스와 관련된 함수 및 값에 액세스
    • 인스턴스 값

      • 정적 메서드와 달리 싱글톤은 인스턴스 메서드(비정적 메서드)와 싱글톤의 상태에서 작동할 수 있는 속성 가질 수 있음
      • 이러한 메서드는 싱글톤 인스턴스의 내부 상태를 수정 가능
public class DatabaseConnection {
    // The single instance of the class
    private static DatabaseConnection instance;
    private String connectionString;
    
    // Private constructor prevents instantiation from outside the class
    private DatabaseConnection(String connStr) {
        this.connectionString = connStr;
    }
    
    // Static method to get the instance
    public static DatabaseConnection getInstance(String connStr) {
        if (instance == null) {
            instance = new DatabaseConnection(connStr);
        }
        return instance;
    }
    
    public void connect() {
        System.out.println("Connecting to database with connection string: " + connectionString);
        // Connection logic here
    }
    
    // Other database connection methods...
}

// Usage
DatabaseConnection dbConn1 = DatabaseConnection.getInstance("jdbc:mysql://localhost:3306/myDb");
dbConn1.connect(); // "Connecting to database with connection string: jdbc:mysql://localhost:3306/myDb"

// Attempt to create a second instance
DatabaseConnection dbConn2 = DatabaseConnection.getInstance("jdbc:mysql://localhost:3306/anotherDb");
dbConn2.connect(); // Still "Connecting to database with connection string: jdbc:mysql://localhost:3306/myDb"

System.out.println(dbConn1 == dbConn2); // true - both variables point to the same instance
profile
일단 한다

0개의 댓글