자바 메모리 구조와 static
자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다.
- 메서드 영역: 클래스 정보를 보관한다. ex) 붕어빵 틀
- 스택 영역: 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다.
- 힙 영역: 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다. ex) 붕어빵 틀로 부터 만들어진 붕어빵
- 메서드 영역 : 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.
- 클래스 정보: 클래스의 실행 코드, 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다.
- static 영역: static 변수들을 보관한다.
- 런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.
- 스택 영역: 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
- 스택 프레임: 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.
- 힙 영역 : 객체와 배열이 생성되는 영역이다. 가비지 컬렉션이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.
스택과 큐 자료 구조
EX) 1번,2번,3번 블럭을 순서대로 넣는다고 하면 넣은 순서대로 빼야한다. 1번->2번->3번->3번->2번->1번
후입 선출(LIFO)
가장 마지막에 넣은 3번이 가장 먼저 나온다. 이렇게 나중에 넣은 것이 가장 먼저 나오는 것을 후입 선출이라 한다.
이런 자료구조를 스택이라 한다.
선입 선출(FIFO)
후입 선출과 반대로 가장 먼저 넣은 것이 가장 먼저 나오는 것을 선입 선출이라 한다. 이런 자료구조를 큐라고 한다.
스택 영역
package memory;
public class JavaMemoryMain1 {
public static void main(String[] args) {
System.out.println("main start");
method1(10);
System.out.println("main end");
}
static void method1(int m1){
System.out.println("method1 start");
int cal = m1 * 2;
method2(cal);
System.out.println("method1 end");
}
static void method2(int m2){
System.out.println("method2 start");
System.out.println("method2 end");
}
}
실행 결과
이 코드의 실행 순서를 보면
호출 순서
처음 자바 프로그램을 실행하면 main()을 실행한다. 이때 main()을 위한 스택 프레임이 하나 생성된다.
main() 스택 프레임은 args라는 매개변수를 가진다.
main()은 method1을 호출하고 method1() 스택 프레임이 생성된다.
method1()은 m1, cal 지역 변수를 가지므로 해당 지역 변수들이 스택 프레임에 포함된다.
method1()은 method2()를 호출한다. method2() 스택 프레임이 생성된다. method2()는 m2 지역 변수를 가지므로 해당 지역변수가 스택 프레임에 포함된다.
종료 순서
method2()가 종료된다. method2() 스택 프레임이 제거되고 매개변수 m2도 제거된다. method2() 스택 프레임이 제거 되었으므로 프로그램은 method1()로 돌아간다. method1()에서 method2()를 호출한 지점으로 돌아가게 되고 method1()이 종료된다. method1() 스택프레임이 제거되고, 지역변수 m1, cal도 제거된다. 프로그램은 main으로 돌아가고 main()이 종료된다. 더 이상 호출할 메서드가 없고, 스택 프레임도 완전히 비워져서 자바는 프로그램을 정리하고 종료 한다.
- 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다.
- 메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.
- 지역 변수(매개변수 포함)는 스택 영역에서 관리한다.
- 스택 프레임이 종료되면 지역 변수도 함께 제거된다.
- 스택 프레임이 모두 제거되면 프로그램도 종료된다.
static 변수
package static1;
public class Data3 {
public String name;
public static int count; //static
public Data3(String name) {
this.name = name;
count++;
}
}
package static1;
public class DataCountMain3 {
public static void main(String[] args) {
Data3 data1 = new Data3("A");
System.out.println("A count=" + Data3.count);
Data3 data2 = new Data3("A");
System.out.println("A count=" + Data3.count);
Data3 data3 = new Data3("A");
System.out.println("A count=" + Data3.count);
}
}
멤버 변수에 static을 붙이면 static 변수, 정적 변수, 또는 클래스 변수라 한다.
static이 붙은 멤버 변수는 메서드 영역에서 관리한다.
static이 붙은 멤버 변수 count는 인스턴스 영역에 생성되지 않는다.
멤버 변수의 종류
- 인스턴스 변수 : static이 붙지 않은 멤버 변수
- static이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라서 인스턴스 변수라 한다.
- 인스턴스 변수는 인스턴스를 만들 때 마다 새로 만들어진다.
- 클래스 변수: static이 붙은 멤버 변수
- 클래스 변수, static 변수, 정적 변수 등으로 부룬드ㅏ.
- static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 변수라 한다.
- 클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다.
변수와 생명주기
지역 변수(매개변수 포함) : 지역 변수는 스택 영역에 있는 스택 프레임 안에 보관된다. 메서드가 종료되면 스택프레임도 제거되는데 이때 해당 스택 프레임에 포함된 지역 변수도 함께 제거된다.
인스턴스 변수: 인스턴스에 있는 멤버 변수를 인스턴스 변수라 한다. 인스턴스 변수는 힙 영역을 사용한다.
클래스 변수: 클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성된다. JVM 이 종료될때 까지 생명주기가 이어진다.
Reference
김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런
김영한 | , 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다? 이걸로는 안됩니다!전 우아한형제들 기술이사, 누적 수강생 40만 명 돌
www.inflearn.com
'JAVA' 카테고리의 다른 글
김영한의 실전 자바 기본편 - 6일차 (0) | 2025.04.27 |
---|---|
김영한의 실전 자바 기본편 - 4일차 (0) | 2025.04.13 |
김영한의 실전 자바 기본편 - 3일차 (0) | 2025.04.06 |
김영한의 실전 자바 기본편 - 2일차 (0) | 2025.03.30 |
김영한의 실전 자바 기본편 - 1일차 (0) | 2025.03.27 |