> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/java_oop_for_spring_framework/undefined/2-..md).

# 2장. 자바의 절차적/구조적 프로그래밍

* 일반적인 프로그램은 실행 시 메모리 영역을 `코드 실행 영역`과 `데이터 저장 영역`으로 나누어 사용한다.
* 객체 지향 프로그램에서는 데이터 저장 영역을 다시 세개로 분할하여 사용한다.
* 메모리의 코드 실행 영역을 공부하면 컴퓨터의 동작 원리를 이해하는데 큰 도움이 되므로 어셈블리어를 공부하는 것을 저자는 권한다. (그치만 교수님… 진쟈 하나도 모르겠더라구요…) 다행히 운영체제나 언어 자체를 개발하는 로우 레벨 개발자가 아닌 이상 코드 실행 영역을 깊게 학습할 필요는 없다고…

***

### 구조적/절차적 프로그래밍 in java

* 절차적 프로그래밍은 한 마디로 goto를 쓰지 않는 프로그래밍이라고 한다. 솔직히 전혀 모르는 부분이다.
* goto를 사용하게 되면 프로그램의 실행 순서가 인간이 이해하기에 너무 복잡해질 가능성이 있기 때문에 자바에선 예약어로 등록해두고, **쓰지 못하게** 막아뒀다.
* 절차 지향, 구조적 프로그래밍의 유산인 함수와 제어는 객체지향의 메서드 안에서 확인할 수 있다. 객체 지향 프로그래밍에서 제어문이 존재할 수 있는 유일한 장소가 바로 메서드이기 때문이다.
*

```
![Untitled](2%E1%84%8C%E1%85%A1%E1%86%BC%20%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%8C%E1%85%A5%E1%86%AF%E1%84%8E%E1%85%A1%E1%84%8C%E1%85%A5%E1%86%A8%20%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%A8%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%84%86%E1%85%B5%E1%86%BC%207a9cb7cec5e64f81b1cab4a2edac9e4b/Untitled%202.png)
```

```
![Untitled](2%E1%84%8C%E1%85%A1%E1%86%BC%20%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%8C%E1%85%A5%E1%86%AF%E1%84%8E%E1%85%A1%E1%84%8C%E1%85%A5%E1%86%A8%20%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%A8%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%84%86%E1%85%B5%E1%86%BC%207a9cb7cec5e64f81b1cab4a2edac9e4b/Untitled%203.png)
```

* JRE를 통해 간단한 프로그램을 실행하는 상황을 가정하면,
  1. JRE은 class 파일에서 main()를 찾아내고,
  2. JVM을 부팅한다.
  3. 이후 JVM은 static 영역에 java.lang 패키지를 로드하고
  4. 개발자가 작성한 모든 클래스와 import 클래스를 static 영역에 로드한다.
* 스택 프레임은 여는 중괄호를 통해 열리고, 닫는 중괄호를 통해 닫힌다. 단, 클래스 구조를 열고 닫는 중괄호는 예외다.
* 따라서 중간에 if/switch 제어문을 만나게 되면 별도의 스택 프레임이 열린다. { 가 나왔으니까…!
  * 다른 얘기지만 난이도가 낮은 알고리즘 문제 중 스택을 활용하는 문제들 뭐 괄호 닫기 같은 문제들이 스택을 사용하는 경우들이 많았는데 생각보다 굉장히 근본 넘치는 문제였고…
*
* 닫는 중괄호를 만나면 if 블록 스택 프레임도 사라진다.
* 지역 변수는 스택 영역, 스택 프레임 안에서 생애 주기가 시작하고 종료된다.
* 클래스 멤버 변수는 스태틱 영역에서 생애주기를 시작하고 마친다.
* 객체 멤버 변수는 힙 영역에서 생애주기를 시작하고, 객체와 함께 가비지 컬렉셔에 의해 마친다.
* 생각해보면 그림에서 설명하는 상황은 외부에서 `특정 메서드( )`에 포함된 `특정 변수`에 접근하고자 하는 것인데 너무 틀려먹은 상황이라 왜 설명하는 것인지도 잘 납득이 되지 않았다.
* 굳이 설명하자면 메서드를 호출하는 시점 이전엔 해당 메서드의 스택 프레임이 생성되지 않았으므로 당연히 해당 스택 프레임에 접근할 수 없고, 메서드가 실행중엔 제어권이 없으며, 메서드가 종료된 이후엔 스택 프레임이 소멸되어 아예 메모리에 존재하지 않는다.
* 저자는 포인터의 예를 들며 자바에서 메서드 스택 프레임 내부 변수에 접근하지 못하는 이유를 설명하지만, 죄송합니다 교수님… 제가… c랑 포인터를 잘 몰라요…

***

### 멀티 스레드/ 멀티 프로세스의 이해

* 멀티 스레드의 T 메모리 모델은 스레드 개수만큼 스택 영역을 분할하는 형식이다.
* 멀티 프로세스는 자료 저장 영역에 다수의 T 메모리를 사용한다. 따라서 멀티 스레드 모델에선 힙 영역을 공유하지만, 멀티 프로세스 모델에선 힙 영역을 공유하지 않는다. 또한 스태틱 영역을 공유하지 않으므로 메모리의 할당 요구량 자체가 크다.
* 자바 웹 개발에서 사용되는 servlet이 표준처럼 사용되는 이유가 이것이고, 대부분의 개발자들이 재할당 가능한 전역 변수의 사용을 엄격히 금지하는 이유이기도 하다.

### summary

* 객체 지향 언어는 결국 절차적/구조적 언어의 일부를 답습하고 있기 때문에 해당 부분에 대해선 잘 이해해두고 있는 것이 좋다.
* 스택 영역에서 메모리가 점유되는 방식은 잘 이해해두고 있자. 대략 소스 코드의 중괄호에 따라 스택 프레임이 열리고, 그 안에서 지역 변수가 메모리를 점유한다.
* 멀티 스레드 방식과 멀티 프로세스 방식 간에 메모리 점유 방식의 차이를 명확히 이해하고 가자. 멀티 스레드에선 스택 영역을 스레드 별로 나누어 사용하고, 힙 영역과 스태틱 영역은 공유한다. 반면 멀티 프로세스 방식에선 자료 저장 공간 자체를 나누어 사용한다.
