서론
싱글톤 패턴, 정적 팩토리 메서드 패턴등의 디자인 패턴에서 사용하는 static variable을 알아보자.
static(정적), 뭐가 정적이라는걸까?
자바에서는 static
키워드를 사용해서 변수나 메서드를 선언할 수 있다. static
을 붙인 변수와 붙이지 않은 변수의 차이점은 뭘까? static
이라는 영어단어를 한글로 해석하면 정적으로 해석할 수 있다. 정적이라는게 동적이지 않다는것인데, 뭐가 정적이라는걸까?
기능을 통해서 유추해보자. 아래와 같이 Test라는 클래스를 만들고 main 메서드를 static으로 선언하였다. JVM에서는 static main메서드를 보고 코드를 실행하게 된다.
class Test {
public static void main(String [] args) {
System.out.println("정적 메서드 테스트 입니다.");
}
}
클래스를 생성하였으면 인스턴스로 만들고 이 인스턴스를 통해서 메서드나 변수에 접근할 수 있음을 이미 알고있을 것이다. 하지만, static으로 선언한 변수나 메서드는 인스턴스로 만들지 않고도 바로 접근이 가능하다.
이제 정적이라는게 뭐가 정적인지 짐작이 간다. 클래스를 생성하고 이를 인스턴스로 생성하면 동적으로 힙 영역에 적재되고 내려가고를 반복하게 된다. 즉, 인스턴스를 생성하는것은 동적이다.
반면, static이 붙은 변수와 메서드는 인스턴스로 만들지 않아도 바로 접근이 가능하다. 프로그램이 실행되고 딱 한번 메모리에 적재되고 동적으로 메모리에서 상태가 변하지 않게된다.
static 변수가 저장되는 영역
Java8 이전
static 키워드가 붙은 자료형은 Heap의 Permanent 영역에 저장된다.
Java8 이후
- Java8 이전의 PermGen 영역에는 Class/Method의 Meta정보, Static Object, 상수화된 String Object, Class와 관련된 배열 객체 Meta 정보, JVM 내부적인 객체들과 최적화컴파일러(JIT)의 최적화 정보 등이 저장
- `Static Object`를 저장하는 경우 객체의 모든 부분이 PermGen에 저장되기 때문에 OOM이 발생하는 경우가 많았다.
- Java 8에서 `Metaspace`가 도입되면서 Static Object 및 상수화된 String Object를 heap 영역으로 옮김으로써, 최대한 `GC`가 될 수 있도록 하였다.
정리
- static이 붙은 변수나 메서드는 모든 인스턴스가 공유한다.
- 프로그램 실행시 딱 한번 메모리에 올라간다.
- 클래스 이름으로 직접 참조한다.
- 이런 특징을 가지고 있어서, 정적 팩토리 메서드 패턴과 싱글톤 디자인 패턴 구현에 사용한다.
- java 8 이전에는 permang generation area영역에 저장
- java 8 이후에는 Metaspace에 저장해서 최대한 GC 당하도록 최적화 시킴
참조
'Java' 카테고리의 다른 글
Executor 인터페이스 (0) | 2020.08.22 |
---|---|
자바- Optional (0) | 2020.08.20 |
이펙티브 자바 3,4,5장 - 인스턴스화 막기/의존 객체 생성자 주입/ 싱글톤 보장 (0) | 2020.08.06 |
인터페이스를 사용하는 이유 (2) | 2020.05.08 |
Java에서 정수를 표현할때 왜 Integer를 많이 사용할까? (0) | 2020.05.07 |
댓글