1. static 이해
static은 클래스가 JVM에 로딩되는 순간부터 존재한다. 즉, 객체 이전 단계에서 이미 메모리에 존재함.
class A {
static int x;
}
- new A() 필요 없이 A.x로 바로 접근이 가능함.
2. class 로딩 시 JVM의 동작
- Class Loader가 class 파일 로딩
- Method Area에 클래스 정보 적재 (데이터, 메서드, static 변수)
- 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();
}
}
실행순서
- statc 변수 기본값
- static 초기화 블록
- 객체 생성
- 생성자 실행
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 |