2021. 7. 30. 14:38ㆍCSE/JAVA
1. 변수들과 T 메모리
스태틱 (Static) 영역 | |
스택 (Stack) 영역 | 힙 (Heap) 영역 |
- 지역 변수 : 스택영역의 스택 프레임 안에 존재한다. 스택 프레임이 사라지면 함께 사라진다
- 클래스 멤버 변수 : 스태틱 영역에 위치한다. JVM이 종료될때까지 고정된 (static) 상태로 그 자리에 있다
- 객체 멤버 변수 : 힙 영역에 존재한다. 객체와 함께 힙 메모리 회수기에 의해 사라진다.
2. 지역변수와 메모리
- 외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다.
- 내부 스택 프레임 == if문 & 외부 스택 프레임 == main() 이라고 가정하고 생각해 볼 것
3. 메서드 호출과 메모리
- 메서드 호출이 일어나면 무조건 호출되는 메서드의 스택 프레임이 T 메모리 스택 영역에 새로 생성된다.
=> 이 때, 반환값을 저장할 변수 공간이 맨 아래, 인자를 저장할 변수공간, 메서드의 지역 변수 순서대로 쌓인다.
(반환 값은 "반환값 : ???" 이런 모양이지 return result라고 "result : ???"가 반환값을 저장할 변수공간은 아니다)
public static void main(String[] args){
int a = 2;
int b = 3;
addFunction(a,b);
}
- 이 때, addFunction 함수에 전달된 인자 a,b는 main 함수 내의 변수 a,b와 동일할까? addFunction 내에서 a,b의 값이 바뀌면 main 함수의 a,b 값도 변화할까?
=> 아니다. 두 변수는 동일하지 않으므로, 값도 변화하지 않는다.
=> Call By Value(값에 의한 호출)
=> 변수 자체가 아니라 변수가 저장한 값만을 복제해서 전달함
- 메서드를 블랙박스화 한다 == 서로의 내부 지역변수를 볼 수 없다
- A()내에서 B()를 실행시켰을 때, B()는 A()의 지역변수를 참조할 수 없도록 되어있다. 왜?
① 메서드는 서로의 고유 공간인데 침범하면 문제가 생길 수 있음
② B()에서 A()의 지역변수에 접근하기 위해서는 정확한 메모리 위치를 알아야 하는데, 이는 '포인터'라고 읽고 메모리 주소 값이라 이해하는 그것이다. => 자바는 포인터가 없다
③ B() 메서드의 스택 프레임은 항상 A() -> B() 꼴이 아니라 A() -> C() -> B()일 수도 있고 여러 가능성들이 있다. 이 때, 만약에 다른 메서드의 지역 변수를 참조할 수 있다면, 어느 메서드 스택 프레임의 변수를 참조해야하는가 라는 문제가 발생하고, 따라서 또 포인터가 필요로 해진다. => 자바는 포인터가 없다.
4. 멀티 스레드 / 멀티 프로세스의 이해
- 멀티 스레드 : 스택 영역을 스레드 개수만큼 분할해서 사용
=> 하나의 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없지만, 스태틱 영역과 힙 영역은 공유함
=> 스태틱 영역을 공유하기 때문에 쓰기 가능한 전역변수를 사용하면 문제가 생김
=> 메모리를 적게 사용한다.
스태틱 영역 | |||
스택 영역 | 힙 영역 | ||
스레드 | 스레드 |
- 멀티 프로세스 : 다수의 T 메모리를 갖는 구조
=> 하나의 프로세스가 다른 프로세스의 T 메모리 영역을 절대 침범할 수 없는 메모리 안전한 구조
=> 메모리 사용량이 크다.
스태틱 영역 | 스태틱 영역 | 스태틱 영역 | |||||
스택 영역 | 힙 영역 | 스택 영역 | 힙 영역 | 스택 영역 | 힙 영역 |
* 필드와 속성의 차이점?
: 필드 == 속성 == 프로퍼티
'CSE > JAVA' 카테고리의 다른 글
[자바 객체 지향] 캡슐화 (0) | 2021.08.05 |
---|---|
[자바 객체 지향] 다형성 (0) | 2021.08.05 |
[자바 객체 지향] 자바와 절차적/구조적 프로그래밍 1 (0) | 2021.07.26 |
06. Exception (0) | 2020.01.20 |
05. Anonymous Inner Class (0) | 2020.01.19 |