자바(Java)에서 static 키워드는 클래스 수준의 멤버(변수, 메서드)를 정의할 때 사용한다. 일반적으로 객체 지향 프로그래밍에서는 클래스를 바탕으로 new 연산자를 통해 인스턴스를 생성해야 멤버에 접근할 수 있다. 하지만 static 키워드가 붙은 멤버는 인스턴스를 생성하지 않고도 클래스 이름을 통해 바로 접근할 수 있다. 프로그램이 실행될 때 메모리에 로드되어 공유된다는 특징을 지닌다.
클래스 내에서 static으로 선언된 변수는 인스턴스마다 별도로 생성되는 일반 변수(인스턴스 변수)와 달리, 해당 클래스의 모든 인스턴스가 하나의 메모리 공간을 공유한다.
class Counter {
static int count = 0; // static 변수
Counter() {
count++;
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.count); // 출력: 2
}
}
static 메서드는 객체 생성 없이 클래스명.메서드명() 형태에 따라 직접 호출할 수 있는 메서드다.
static 메서드는 호출될 수 있기 때문이다.Math.abs(), Math.max() 등)를 만들 때 유용하게 쓰인다.public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
// 사용 예시
int result = MathUtils.add(10, 20); // 객체 생성 없이 직접 호출
static 변수가 복잡한 초기화 로직을 필요로 할 때 static 블록을 활용할 수 있다.
static 변수의 초기화 작업에 사용된다.public class Config {
static String serverUrl;
static {
// 복잡한 초기화 로직 수행
serverUrl = "https://api.example.com";
}
}
static 키워드는 편리하지만 무분별한 사용은 지양해야 한다.
static 멤버는 프로그램이 종료될 때까지 메모리에 유지되므로, 너무 큰 데이터를 남발하면 Garbage Collection의 대상이 되지 않아 메모리 효율이 떨어질 수 있다.static 키워드는 메모리의 효율적 공유와 객체 생성 없는 접근성이라는 명확한 장점을 가진다. 공통 데이터 관리나 유틸리티 성격의 메서드 정의에 적합하다.
하지만 프로그램 전체 생명주기 동안 메모리를 차지하고 객체 지향적 설계를 저해할 수 있다.