개요
자바를 사용할 때 정말 밥 먹듯이 사용하던 static 키워드..
오늘은 static 키워드에 대해 정리해 보자.
static
static의 사전적 의미는 ‘고정된’이다.
자바에선 이 static 키워드를 사용해 고정된 필드, 고정된 메서드를 만들 수 있다.
이렇게 고정된 필드, 고정된 메서드를 합쳐서 정적 멤버라고 표현한다.
만약 정적 멤버는 클래스가 클래스 로더에 의해 메모리에 저장될 때 함께 저장되는데, 이러한 정적 멤버는 한번 생성되면 자바 애플리케이션이 종료될 때까지 메모리에 남아있는다.
다음은 static이 적용된 클래스 예시이다.
class Member {
static int age; // 정적 멤버 (클래스에 속함)
String name; // 인스턴스 필드 (객체에 속함)
public static void method1() {...} // 정적 메서드 (클래스에 속함)
public void method2() {...} // 인스턴스 메서드 (객체에 속함)
}
주석을 보다시피 static이 달린 멤버들은 모두 클래스에 속한다.
위의 String name이나 void method2()와 같은 인스턴스 멤버들은 객체가 생성될 때 메모리의 힙 영역에 저장된다.
하지만 static int age와 static void method1()은 객체가 생성되기 이전, 클래스가 메모리에 로드될 때 클래스 영역에 저장된다.
즉, 생성되는 타이밍이 다른 것이다.
class Member {
static int staticCount = 0; // 정적 멤버
int instanceCount = 0; // 인스턴스 필드
public static void incrementStaticCount() {
staticCount++;
}
public void incrementInstanceCount() {
instanceCount++;
}
}
public class StaticTest {
public static void main(String[] args) {
Member.incrementStaticCount(); // 정적 메서드이기 때문에 객체를 생성하지 않고도 메서드 호출이 가능
Member member = new Member(); // Member 객체 생성
System.out.println(member.instanceCount);
System.out.println(member.staticCount);
}
}
-----------------------------
[결과]
0
1
만약 아래의 StaticTest를 실행시키면 Member 객체가 생성될 때 함께 생성된 instanceCount는 0을 유지한다.
하지만 Member 객체가 생성되기 전, 정적 메서드인 incrementStaticCount()을 호출해 staticCount을 1 증가시켰다.
이 과정이 가능한 이유는 이미 static int staticCount와 static void incrementStaticCount()가 클래스 영역에 저장되었기 때문이다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.01.24 - 낙관적 락 vs 비관적 락 (0) | 2025.01.24 |
---|---|
[개발 일기] 2025.01.23 - 직렬화 (0) | 2025.01.23 |
[개발 일기] 2025.01.21 - TCP/IP (0) | 2025.01.21 |
[개발 일기] 2025.01.20 - 함수형 인터페이스 (0) | 2025.01.20 |
[개발 일기] 2025.01.19 - JWT(JWS, JWE) (0) | 2025.01.19 |