[자바 객체 지향] 자바와 절차적/구조적 프로그래밍 2

2021. 7. 30. 14:38CSE/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