Java & Spring/Java

Static

승주우에요 2026. 1. 5. 21:43

1. static 이해

static은 클래스가 JVM에 로딩되는 순간부터 존재한다. 즉, 객체 이전 단계에서 이미 메모리에 존재함.

class A {
    static int x;
}
  • new A() 필요 없이 A.x로 바로 접근이 가능함.

2. class 로딩 시 JVM의 동작

  1. Class Loader가 class 파일 로딩
  2. Method Area에 클래스 정보 적재 (데이터, 메서드, static 변수)
  3. static 초기화 수행 (기본값, 초기화 블록 실행)
class Example {
    static int x = 10;

    static {
        System.out.println("static block");
    }
}

📌 객체가 없어도 static 변수와 print문은 동작함.

 

3. static 변수의 메모리와 생명주기

항목 static 변수
저장 위치 Method Area
생성 시점 클래스 로딩 시
소멸 시점 JVM 종료 시
GC 대상 X

📌static은 GC가 관리하지 않아 잘못 쓰면 메모리 누수의 원인이 될 수 있어 주의할 것

 

4. static 메서드의 특징

class Calculator {
	static int add(int a, int b){
    	return a + b;
    }
}
  • 객체 없이 호출 가능 
  • this 사용 불가
  • 인스턴스 변수/메서드 직접 접근 불가 -> static 메서드는 객체 생성 이전에 존재하기 때문이다.

5. main 메서드가 static인 이유

  • JVM 시작 시 객체를 만들기 전에 main 메서드를 호출해야 하기 때문에
  • 프로그램의 시작점인 main은 그 이전에 존재해야 한다
  • 어떤 객체가 생성되더라도 프로그램의 시작점은 단 하나여야 하므로, 

6. static 초기화 블록

용도

  • static 변수의 복잡한 초기화
  • 클래스 로딩 시 단 한번 실행
class Person {
	static int age;
    
    static {
    	age = getAge();
    }
}

실행순서

  1. statc 변수 기본값
  2. static 초기화 블록
  3. 객체 생성
  4. 생성자 실행

7. static import

import static java.lang.Math.*;

public class Test {
    public static void main(String[] args) {
        System.out.println(abs(-3));
    }
}
  • 클래스명 생략 가능
  • 가독성을 높여줌

📌 상수/수학 함수 정도만 제한적으로 사용한다

 

8. static과 싱글톤의 관계

싱글톤 패턴

인스턴스를 1개만 유지하도록

class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}
  • static이 구현하는데 사용
  • Spring 은 기본적으로 싱글톤임 -> 추후에 다룰 예정

9. 언제 static을 써야 하는가

  • 모든 객체가 공유해야 하는 값
  • 상수
  • 유틸리티 메서드
  • 상태 없는 기능

편리함이 아닌 설계임

 

10. 핵심 요약

  • static은 객체가 아닌 클래스 로딩 시점의 멤버
  • static 메서드는 Method Area에 존재하고 GC 대상이 아님
  • static 메서드는 객체 생성 이전에 존재하기 때문에 인스턴스 접근이 불가능함
  • 싱글톤 구현에 활용됨

 

'Java & Spring > Java' 카테고리의 다른 글

생성자&this,this()  (0) 2026.01.06
메서드  (0) 2026.01.06
객체의 상태와 변수의 생명주기  (0) 2026.01.05
객체 지향 기본  (0) 2026.01.05
객체지향프로그래밍(OOP)  (0) 2026.01.05