지금까지 static, final, static final에 대한 개념이 제대로 박혀있지 않았다....
지금에서야 개념을 정리하고자 글을 작성한다.
일단 내 머릿속에 있는
static은 선언시 메모리영역에 저장되며 static이 선언된 값을 하나의 주소값으로 공유해서 쓴다?
그리고 final은 값을 변경할 수 없다.
static final은 이 둘을 합친것???... 여기까지였다...
우선 JVM 메모리 구조가 어떻게 생겼는지 공부할겸 다른 블로그에서 퍼왔다...

자바 소스 파일은 자바 컴파일러에 의해 바이트 코드 형태인 클래스 파일로 변환되고
변환된 클래스 파일은 클래스 로더가 읽어들이면서 JVM이 수행된다고 한다.
Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이라고 한다.
Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행해준다고 한다.
최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였다고 한다.
참고로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다고 하는데
이유는 JIT는 바이트 코드를 네이티브 코드로 변환하여 실행을 빠르게 한다는데 그 과정에 있어 비용 발생이 있어서 그렇다고 한다.
Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다고 한다.
이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다고 한다.
Runtime Data Area
(이제부터 내가 알고싶었던 부분이 나온다.) JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이라고 한다.
- Method area : 모든 쓰레드가 공유하는 메모리 영역이며, 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.
- Heap area : 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역이며, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이라고 한다.
- Stack area : 메소드 내에서 정의하는 기본 자료형(int, double, byte, long, boolean 등)에 해당되는 지역변수(매개 변수 및 블럭문 내 변수 포함)의 데이터의 값이 저장되는 공간이 Stack(스택) 영역이다. 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다고 한다.
- PC Register : 쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재하며, 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다고 한다.
- Native method stack : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이라 한다.
여기서 Method area라는 영역에 Static 변수가 저장된다는걸 알 수 있었다.
1. static은 "고정된" 이라는 의미를 가지며 공용 데이터에 해당하거나 인스턴스 필드를 포함하지 않는 메소드를 선언하고자 할 때 이용한다고 한다.
2. final은 "최종적인" 이라는 의미를 가지며
final이 붙은 해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능하다는것을 의미한다고 한다.
(내가 알던것과 크게 다르지 않아서 다행...)
3. static final은 "고정된 + 최종적인"의 의미로, 상수를 선언하고자 할 때 사용된다.
위에서 본 메모리 영역에 저장된다는것을 생각해보면 메모리 영역에 올라가있는 어떠한 값은 불변이다 라는 의미인거같다.
주에 한번씩은 이렇게 뭐가됐든 기본 개념 하나씩 공부를 해볼까 한다.
참고한 블로그