JAVA (11) - static 키워드
JAVA (11) - static 키워드
1. 개요
자바(Java)에서 static 키워드는 클래스 수준의 멤버(변수, 메서드)를 정의할 때 사용한다. 일반적으로 객체 지향 프로그래밍에서는 클래스를 바탕으로 new 연산자를 통해 인스턴스를 생성해야 멤버에 접근할 수 있다. 하지만 static 키워드가 붙은 멤버는 인스턴스를 생성하지 않고도 클래스 이름을 통해 바로 접근할 수 있다. 프로그램이 실행될 때 메모리에 로드되어 공유된다는 특징을 지닌다.
2. static 변수 (정적 변수 / 클래스 변수)
클래스 내에서 static으로 선언된 변수는 인스턴스마다 별도로 생성되는 일반 변수(인스턴스 변수)와 달리, 해당 클래스의 모든 인스턴스가 하나의 메모리 공간을 공유한다.
- 메모리 할당 시점: JVM이 클래스를 로딩하는 시점에 메소드 영역(Method Area 또는 Metaspace)에 메모리가 할당된다.
- 공유성: 모든 인스턴스가 동일한 값을 참조하고 변경 사항을 공유한다.
- 사용 목적: 공통으로 관리해야 하는 데이터(예: 생성된 객체의 개수 카운트, 공통 설정값 등)를 다룰 때 적합하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
}
}
3. static 메서드 (정적 메서드)
static 메서드는 객체 생성 없이 클래스명.메서드명() 형태에 따라 직접 호출할 수 있는 메서드다.
- 특징: 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 직접 사용할 수 없다. 인스턴스가 생성되지 않은 시점에도
static메서드는 호출될 수 있기 때문이다. - 사용 목적: Utility 성격의 함수(예:
Math.abs(),Math.max()등)를 만들 때 유용하게 쓰인다.
1
2
3
4
5
6
7
8
9
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
// 사용 예시
int result = MathUtils.add(10, 20); // 객체 생성 없이 직접 호출
4. static 블록 (정적 초기화 블록)
static 변수가 복잡한 초기화 로직을 필요로 할 때 static 블록을 활용할 수 있다.
- 클래스가 메모리에 처음 로딩될 때 딱 한 번만 실행된다.
- 생성자보다 먼저 실행되며, 주로
static변수의 초기화 작업에 사용된다.
1
2
3
4
5
6
7
8
9
public class Config {
static String serverUrl;
static {
// 복잡한 초기화 로직 수행
serverUrl = "https://api.example.com";
}
}
5. static 사용 시 주의점
static 키워드는 편리하지만 무분별한 사용은 지양해야 한다.
- 메모리 관리:
static멤버는 프로그램이 종료될 때까지 메모리에 유지되므로, 너무 큰 데이터를 남발하면 Garbage Collection의 대상이 되지 않아 메모리 효율이 떨어질 수 있다. - 객체 지향 원칙 저해: 상태를 가질 경우, 여러 쓰레드에서 동시에 변경을 시도할 때 동시성 문제가 발생할 수 있으며 객체 간의 결합도가 높아진다.
- 테스트의 어려움: 공유 상태를 가지므로 단위 테스트 실행 시 독립성을 보장하기 어렵다.
6. 정리
static 키워드는 메모리의 효율적 공유와 객체 생성 없는 접근성이라는 명확한 장점을 가진다. 공통 데이터 관리나 유틸리티 성격의 메서드 정의에 적합하다.
하지만 프로그램 전체 생명주기 동안 메모리를 차지하고 객체 지향적 설계를 저해할 수 있다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.