Static
'정적인' 사전적 의미를 가짐
클래스가 메모리에 로딩 시점에 한번에 생성되어 프로그램 종료 시까지 유지
한 클래스에서 공통적인 값을 유지할 필요가 있는 경우
객체를 생성하지 않고 <클래스이름.static 맴버>로 접근
Static 변수
모든 인스턴스가 변수를 공유한다. 같은 타입의 인스턴스가 값을 바꾸면 다른 객체의 Static 변수도 값이 변한다.
class Counter {
static int count = 0; // 모든 인스턴스가 공유
int id; // 각 인스턴스마다 다른 값
Counter() {
count++;
id = count;
}
}
public class Main {
public static void main(String[] args) {
Counter a = new Counter();
Counter b = new Counter();
System.out.println(Counter.count); // 2
System.out.println(a.id); // 1
System.out.println(b.id); // 2
}
}
Static 메서드
인스턴스 없이 사용할 수 있는 메서드, 유틸리티 함수처럼 동작한다.
해당 메서드 내부에는 인스턴스 변수, 메서드는 직접 접근할 수 없다.
왜? Static 변수 메서드는 메모리 로딩 시점에 생성된다. 해당 시점에서는 인스턴스의 변수, 메서드가 어떤 것이 있는지 식별할 수 없기 때문이다.
class MathUtil {
static int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
int result = MathUtil.add(3, 5); // 인스턴스 없이 호출
System.out.println(result); // 8
}
}
사용 이유
공통 저장 공간
모든 객체가 공유해야하는 값(설정, 상수, 카운트)들을 한 곳에서 관리하기 위해서 사용
객체 생성 없이 사용
Collections, Arrays, Integer와 같은 클래스에서는 정적 메서드를 제공
메모리 성능 측면
인스턴스마다 같은 값을 들고 있어야 한다면, 각 인스턴트에서 복사된 같은 값을 소유하는 것이 아닌 static 변수로 두면 메모리 낭비를 줄일 수 있다.
주의점
남용
너무 Static 변수를 사용하면 유지 보수가 어려워질 수 있다.
즉, 꼭 공용으로 사용해야하는지에 대한 명확한 이유가 있어야 한다.
Static은 어느 곳에서도 접근이 가능해 동시성 이슈가 발생할 수 있어 주의해야한다.
'Development > Java' 카테고리의 다른 글
| [Java] 다형성(Polymorphism) (0) | 2025.11.13 |
|---|---|
| [Java] 추상 클래스와 인터페이스 (0) | 2025.09.03 |
| [Java] equals(), == 연산 null 비교 (0) | 2025.06.20 |
| [Java] ==와 equals()의 차이 (2) | 2025.06.16 |
| [Java] String compareTo() 메서드 (2) | 2025.06.15 |