코드
package exam;
class 엘리스 {
static String name = "엘리스";
int height = 160;
void eat(int qty) {
this.height = this.height + (10 * qty);
}
}
public class Alice {
public static void main(String[] args) {
엘리스 e = new 엘리스();
e.eat(5);
System.out.println(e.height);
}
}
진행 상황
1. 클래스 로드 및 Static 로드
1.1 클래스 로드
Static 변수와 클래스의 구조를 읽어온다.
1.2. Static 로드
해당 Static 변수와 메소드가 할당되며, Static 변수가 로드 한다.
- class 앨리스 : static String name = "엘리스"
- class Alice : static void main(String[] args)
2. Main 메소드 실행 및 Stack 생성
2.1. Main 메소드 실행
아래의 Main 메소드 조건에 부합하면, JVM은 Main 메소드를 실행한다.
- 조건
- public
- static
- 메소드 이름 = Main
2.2. Stack과 Queue 생성
3. Heap 생성 및 객체 참조
3.1. Heap 생성
new 엘리스( );
➡️ Heap 생성
3.2. Heap에 데이터 저장
- Heap의 아무 공간에
엘리스(class 명) 타입
으로height = 160 / eat
인 인스턴스가 생성된다.
Heap은 객체 데이터를 저장
하고, JVM이 이를 관리한다.
3.3. stack에 참조 변수 생성
Stack의 변수는 실제 데이터 대신, Heap에 있는
객체의 참조(주소)를 저장
한다.- Stack의 공간 용량은 알 수 없기 때문에 값을 저장하지 않고, 정확한 데이터의 용량만 저장한다.
엘리스 e
➡️ Main의 Stack 실행- stack에
앨리스 e
가 만들어 지며, 위의 heap에 저장된height = 160 / eat
의 주소를 저장한다. 👉 heap의 저장 위치 주소 , 포인터
를 표시한다.
❔ new
- new의 저장 공간은
4byte
이다. 주소만 저장함으로써 stack에는 4byte만 저장하고 그 주소로 heap에 저장된 값을 사용한다. 일정하지 않은 데이터는 heap에 저장한다.
- new는 참조 변수, 레퍼런스 변수라고 한다.
4. 메소드 호출 및 데이터 조작
4.1. 메소드 호출
e.eat(5) 호출
➡️ Stack에 저장'eat' 메소드에 대한호출 정보
와 인자 값qty=5
가 저장된다.
4.2 Heap의 데이터 변경
e.eat(5) 실행
➡️ Heap 데이터 수정 메소드 내에서 this.height += 10 * qty는this가 가리키는 객체(e)의 height 속성을 변경
한다.
❔
- Static 메모리
- Static 메모리는
공유 메모리
라고 한다. new로 호출할 필요 없어 static은 한번만 뜨면 어디서든 사용이 가능하기 때문이다.예) class명.name - 메소드가 실행하기 전의 Main의 Stack에 Static 메모리는 이미 존재하지만, 그 안의 변수(함수)는 실행이 되어야 존재해진다.
- Stack의 접근
- Stack은 다른 Stack에 접근이 불가능하다.
- Stack은 같은 Class 내 Heap에 접근이 가능하다.
- stack이 다른 곳에서 값을 불러오고 싶으면 return이나 자기 class에서 그 값을 heap에 저장해야 한다.
Share article