자바 메모리 구조
- 메서드 영역(Method Area): 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.
- 클래스 정보: 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다.
- static 영역: static 변수들을 보관한다.
- 런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.
- 스택 영역(Stack Area): 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다. (쓰레드 수 만큼 스택 영역이 생성된다.)
- 스택 프레임: 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.
- 힙 영역(Heap Area): 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되니 않는 객체는 GC에 의해 제거된다.
스택과 큐 자료 구조
- 스택 - 후입 선출(LIFO, Last In First Out)
- 큐 - 선입 선출(FIFO, First In First Out)
- 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다.
- 메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.
- 지역 변수(매개변수 포함)는 스택 영역에서 관리한다.
- 스택 프레임이 종료되면 지역 변수도 함께 제거된다.
- 스택 프레임이 모두 제거되면 프로그램도 종료된다.
스택 영역과 힙 영역
- 지역 변수는 스택 영역에, 객체(인스턴스)는 힙 영역에 관리된다.
- static은 메서드 영역에서 관리한다.
멤버 변수(필드)의 종류
- 인스턴스 변수: static이 붙지 않은 변수
- static이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라서 인스턴스 변수라 한다.
- 인스턴스 변수는 인스턴스를 새로 만들 때 마다 새로 만들어진다.
- 클래스 변수: static이 붙은 변수
- 클래스 변수, 정적 변수, static 변수 등으로 부른다.
- static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 변수라 한다.
- 클래스 변수는 자바 프로그램을 실행 할 때 딱1 개가 만들어진다. 인스턴스와는 다르게 보통 여로곳에서 공유하는 목적으로 사용된다.
변수와 생명주기
- 지역 변수(매개변수 포함): 지역 변수는 스택 영역에 있는 스택 프레임 안에 보관된다. 메서드가 종료되면 스택 프레임도 제거 되는데 이때 해당 스택 프레임에 포함된 지역 변수도 함께 제거된다. 따라서 지역 변수는 생존 주기가 짧다.
- 인스턴스 변수: 인스턴스에 있는 멤버 변수를 인스턴스 변수라 한다. 인스턴스 변수는 힙 영역을 사용한다. 힙 영역은 GC(가비지 컬렉션)가 발생하기 전까지는 생존하기 때문에 보통 지역 변수보다는 생존 주기가 길다.
- 클래스 변수: 클래스 변수는 메서드 영역의 static 영역에 보관되는 변수이다. 메서드 영역은 프로그램 전체에서 사용하는 공용 공간이다. 클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성된다. 그리고 JVM이 종료될 때 까지 생명주기가 이어진다. 따라서 가장 긴 생명주기를 가진다.
힙 영역에 생성되는 인스턴스 변수는 동적으로 생성되고, 제거된다. 반면에 static인 정적 변수는 거의 프로그램 실행 시점에 딱 만들어지고, 프로그램 종료 시점에 제거되므로 정적이다.
멤버 메스드의 종류
- 인스턴스 메서드: static이 붙지 않은 멤버 메서드
- 클래스 메서드(정적 메서드): static이 붙은 멤버 메서드
- 클래스 메서드, 정적 메서드, static 메서드 등으로 부른다.
- 메서드 앞에도 static을 붙일 수 있으며 이것을 정적 메서드 또는 클래스 메서드라 한다. 정적 메서드라는 용어는 static이 정적이라는 뜻이고, 클래스 메서드라는 용어는 인스턴스 생성 없이 마치 클래스에 있는 메서드를 바로 호출하는 것처럼 느끼기 때문이다.
- 정적 메서드는 static만 사용할 수 있다.
출처 - 김영한의 실전 자바 기본편
'Backend > Java' 카테고리의 다른 글
다형성(Polymorphism) (0) | 2024.08.06 |
---|---|
상속 (0) | 2024.08.04 |
패키지와 캡슐화 (0) | 2024.08.03 |
절차 지향 프로그래밍 vs 객체 지향 프로그래밍 (0) | 2024.08.02 |
기본형 vs 참조형 (0) | 2024.08.02 |