728x90
반응형

Java에서 하나의 공통 자원을 공유하려 할 때 static 키워드와 Singleton 패턴은 자주 비교됩니다.
두 방식은 비슷해 보이지만, 메모리 처리, 객체화 여부, 유지보수성에서 큰 차이가 있습니다.

이 글에서는 두 개념의 본질적인 차이언제 어떤 방식이 적합한지를 명확히 정리해드립니다.


✅ static이란?

  • 클래스 로딩 시 Method Area에 한번만 할당
  • 객체 생성 없이 클래스명으로 직접 접근 가능
  • 공통 유틸리티나 상수 정의에 적합
public class Util {
    public static int add(int a, int b) {
        return a + b;
    }
}
Util.add(3, 5);  // 객체 없이 바로 사용

✅ Singleton이란?

Singleton 구현 방식은 내 블로그 - Java Singleton 패턴 설명 포스트를 참고해주세요.

  • 객체를 하나만 생성하도록 보장하는 디자인 패턴
  • 지연 생성(Lazy Initialization) 가능
  • 상태를 유지할 수 있으며, 다형성 사용 가능

🧠 static vs Singleton 비교

항목staticSingleton
생성 시점 클래스 로딩 시 필요할 때 (Lazy 가능)
메모리 위치 Method Area Heap
객체화 여부 ❌ (객체 없음) ✅ (객체 존재)
상태 관리 불가능 (stateless) 가능 (stateful)
테스트 용이성 어렵다 (전역처럼 작동) 비교적 쉬움 (Mock 객체 가능)
다형성 불가능 가능 (인터페이스 구현 등)
 

✅ 언제 static을 쓰고 언제 Singleton을 써야 할까?

🔹 static이 적합한 경우

  • 상태가 필요 없는 순수 유틸성 로직
  • 계산기능, 공통 상수, 로그 포맷 등

🔹 Singleton이 적합한 경우

  • 상태 저장이 필요한 공용 객체
  • 의존성 주입이 필요한 서비스, DB 연결 등

🎯 결론

  • static: 단순하고 빠르지만 유연하지 않음
  • Singleton: 설계는 복잡하지만 유연성과 확장성이 좋음

상황에 맞는 선택이 유지보수성과 테스트 효율성을 크게 좌우합니다.

728x90
반응형
728x90
반응형

Java에서 자주 마주치는 static 키워드, 정확히 어떤 역할을 하고 어떻게 동작할까요?
이번 포스트에서는 static 키워드의 메모리 구조, 특징, 사용 예시까지 한 번에 정리해 드립니다.


✅ static이란?

  • static은 클래스 로딩 시 메모리에 한번만 할당되고,
    프로그램이 종료될 때까지 공유되고 유지되는 자원입니다.
  • 객체를 생성하지 않아도 클래스명으로 직접 접근할 수 있다는 것이 특징입니다.

🧠 static의 메모리 구조

구분메모리 영역설명
클래스 자체 Method Area (static 영역) 클래스 정보 로드
new 생성 객체 Heap 영역 Garbage Collector 관리 대상
static 변수/메서드 Method Area (static 영역) 프로그램 종료 시까지 유지
 

🔸 static은 GC의 대상이 아니며, 모든 인스턴스가 공유합니다.


📌 static 변수/메소드 특징

  • 클래스 변수 (모든 객체가 공통으로 사용)
  • 객체 생성 없이도 사용 가능 (클래스명.변수, 클래스명.메서드)
  • 자주 사용하면 메모리 누수 위험 존재 (GC가 해제하지 않음)

✅ Java 코드 예시

public class Calculator {
    public static String calName = "myBoard";

    public static int add(int x, int y) {
        return x + y;
    }

    public int min(int x, int y) {
        return x - y;
    }
}

☑ 사용 예시

Calculator.add(5, 1);  // ✅ 객체 없이 사용 가능
Calculator.min(5, 1);  // ❌ 오류 (static 아님)

Calculator cal = new Calculator();
cal.add(5, 1);  // 가능은 하지만 ❗비권장
cal.min(5, 1);  // 정상 사용

⚠ static 사용 시 주의사항

  • 전역 상태처럼 작동하므로 남용 시 테스트 어려움, 의존성 증가
  • 웹 서버 환경에서는 동시성 이슈 발생 가능성
  • 주로 공용 유틸성 클래스 또는 상수 선언에 사용
728x90
반응형

+ Recent posts