개발/JAVA

JAVA의 Static과 Singleton 패턴 쉽게 이해하기

예니03 2025. 2. 20. 08:49
반응형

자바를 배우다 보면 static과 Singleton 패턴이라는 개념을 자주 접하게 됩니다. 처음에는 어렵게 느껴질 수 있지만, 한 번 이해하면 아주 유용하게 활용할 수 있어요! 이번 글에서는 간단한 예제를 통해 static과 Singleton 패턴이 무엇인지 알아보겠습니다.

1. Singleton 패턴이란?

Singleton 패턴은 클래스의 인스턴스를 하나만 생성하고, 어디서든 이 인스턴스를 공유하도록 하는 디자인 패턴입니다. 프로그램에서 하나의 객체만 필요할 때 사용하면 좋습니다. 예를 들면 데이터베이스 연결, 설정 관리, 로깅 시스템 등이 있습니다.

Singleton 패턴 구현하기

// Singleton.java
package com.javaex.oop.staticmember;

public class Singleton {
    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // private 생성자 -> 외부에서 new Singleton() 불가능!
    }
    
    public static Singleton getInstance() {
        return instance; // 유일한 인스턴스 반환
    }
}

위 코드에서 private 생성자를 사용해 외부에서 객체를 생성하지 못하게 막았습니다. getInstance() 메서드를 통해 항상 같은 객체를 반환하도록 했습니다.

Singleton 패턴 테스트하기

// SingletonApp.java
package com.javaex.oop.staticmember;

public class SingletonApp {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
        
        // 두 객체가 같은지 확인
        System.out.println("s1 == s2 ? " + (s1 == s2)); // true
    }
}

실행 결과

s1 = com.javaex.oop.staticmember.Singleton@15db9742
s2 = com.javaex.oop.staticmember.Singleton@15db9742
s1 == s2 ? true

두 개의 변수를 만들었지만 같은 객체를 가리키고 있습니다! 즉, Singleton 패턴이 잘 적용되었습니다.

 

2. Static 키워드란?

static 키워드는 클래스에 속하는 변수나 메서드를 만들 때 사용합니다. 즉, static이 붙은 변수나 메서드는 객체를 생성하지 않아도 사용할 수 있습니다.

Static 변수와 인스턴스 변수 차이점

// StaticEx.java
package com.javaex.oop.staticmember;

public class StaticEx {
    public static int refCount; // static 변수 (공유됨)
    public static String classVar; // static 변수
    public String instanceVar; // 인스턴스 변수
    
    // static 블록 (클래스 로딩 시 한 번만 실행)
    static {
        refCount = 0;
        classVar = "Static Member";
        System.out.println("클래스 영역 초기화");
    }
    
    // 생성자
    public StaticEx() {
        refCount++;
        System.out.println("refCount: " + refCount);
    }
}

refCount와 classVar는 static 키워드가 붙어 있기 때문에 모든 객체가 공유하는 변수입니다.

Static 변수 테스트하기

// StaticExApp.java
package com.javaex.oop.staticmember;

public class StaticExApp {
    public static void main(String[] args) {
        StaticEx s1 = new StaticEx();
        System.out.println("refCount: " + StaticEx.refCount);
        
        StaticEx s2 = new StaticEx();
        System.out.println("refCount: " + StaticEx.refCount);
        
        StaticEx s3 = new StaticEx();
        System.out.println("refCount: " + StaticEx.refCount);
    }
}

실행 결과

클래스 영역 초기화
refCount: 1
refCount: 2
refCount: 3

refCount 변수가 모든 객체에서 공유되기 때문에, 새로운 객체가 생성될 때마다 값이 증가하는 것을 확인할 수 있습니다.

 

3. Static과 Singleton 패턴의 차이점

구분 Singleton 패턴 Static 변수
객체 생성 단 하나의 객체 유지 객체 생성 없이 사용 가능
메모리 사용 필요할 때만 메모리를 차지 프로그램 종료 전까지 메모리 유지
상태 유지 상태를 가질 수 있음 보통 상태 없이 공유 데이터 저장
사용 예시 데이터베이스 연결, 설정 관리 상수, 유틸리티 메서드 (Math.PI, System.out)

 

마무리

이번 글에서는 Singleton 패턴과 static 키워드에 대해 알아보았습니다.

  • Singleton 패턴은 하나의 인스턴스만 유지하는 디자인 패턴으로, 데이터베이스 연결, 설정 관리 등에 유용합니다.
  • static 키워드는 클래스에 속하는 변수와 메서드를 만들 때 사용하며, 객체를 생성하지 않아도 접근할 수 있습니다.

둘의 차이를 잘 이해하면 프로그램을 더 효율적으로 설계할 수 있습니다! 🚀

반응형