티스토리 뷰
자바에는 다음과 같은 3종류의 변수가 존재한다.
변수의 종류와 상관없이 모든 객체는 heap 영역에 저장된다는 설명은 아래에서 생략한다.
전역 변수
자바에는 엄밀히 말해서 전역 변수 (Global Variables)는 존재하지 않는다.
대신 전역 변수를 사용하기 위해서는 class는 public으로 변수에는 public static 키워드를 사용하여 선언하여 사용한다.
static으로 선언된 변수는 클래스가 어떤 방식으로든 한번 선언된 이후에 메모리에 적재되고 그 이후에 애플리케이션이 종료될 때까지 메모리에 존재하게 된다.
(애플리케이션을 맨 처음에 실행했을때 메모리에 적재되는 것이 아니다.)
이를 통해 전역 변수'처럼' 사용할 수 있게 구현할 수 있다.
자바 8 이전에는 PermGen 영역(a.k.a 메서드 영역)이라 불리는 곳에 static 변수들이 저장되었다.
(PermGen 영역은 intern String (e.g. String str = "ABC";), 클래스 메타데이터, static 변수들이 저장되는 공간이다.)
자바 8 이후부터는 PermGen 영역의 존재에 의한 부작용을 없애기 위해 해당 영역을 제거하고 MetaSpace 영역을 새로 구현하게 되었고 MetaSpace에는 클래스 메타데이터만 저장하게 설정되었다. 이로 인해 PermGen 영역에 저장되던 static 변수들은 heap 영역에 저장되도록 변경되었다.
(MetaSpace 영역은 OS에서 해당 애플리케이션에 제공한 메모리 그 자체인 native 영역에 포함되며 intern String은 heap 영역의 String constant pool에 저장된다.)
모던 자바에서는 전역 변수가 메서드 영역이 아닌 힙 영역에 저장된다는 점을 명심하자.
인스턴스 변수
메서드 내에 포함되어 있지 않고 static이 아닌 모든 변수를 의미한다.
인스턴스 변수는 선언만 하고 초기화를 하지 않아도 자동으로 기본값으로 초기화된다.
인스턴스 변수는 힙 영역에 저장된다.
지역 변수
메서드 내에서 선언 및 초기화 된 변수를 의미한다.
선언과 초기화 둘 다 반드시 필수적으로 진행해야 한다.
지역 변수는 콜 스택 영역에 저장된다.
콜 스택 영역에는 메서드 시그니쳐, 지역 변수, return 값 등이 저장된다.
'CS > Java' 카테고리의 다른 글
자바에서 동시성 문제를 해결하는 방법 (0) | 2022.09.17 |
---|---|
자바의 <<, >>, >>>와 그의 활용 (0) | 2022.09.06 |
자바 8, 11, 17 버전별 기능 차이 (0) | 2022.08.26 |
자바 정규표현식 (0) | 2022.08.13 |
자바의 G1 GC의 원리에 대해 알아보자 (0) | 2022.08.08 |
- Total
- Today
- Yesterday
- ModelAttribute
- RequestBody
- 배포
- 레디스
- neovim
- vim
- 아키텍처
- RequestParam
- lunarvim
- 도커
- IDE
- 루나빔
- RequestPart
- Dap
- JavaScript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |