자바 프로그램의 개발과 구동
- JVM (Java Virtual Machine) : 가상기계

- 배포되는 JDK, JRE, JVM은 편의를 위해 JDK가 JRE를 포함하고 다시 JRE는 JVM을 포함하는 형태로 배포된다.
- 기존 언어로 작성한 프로그램은 각 플랫폼(하드웨어와 OS의 조합)용으로 배포되는 설치 파일을 따로 준비해야 하지만 자바 개발자는 본인이 사용중인 플랫폼에 설치된 JVM용으로 프로그램을 작성하고 배포하면 각 플랫폼에 맞는 JVM이 중재자로서 각 플랫폼에서 프로그램을 구동하는 데 아무문제가 없도록 해준다. (write once run anywhere)
- JDK = jave development kit = 자바 개발 도구 JRE = java runtime environment = 자바 실행 환경 JVM = java virtual machine = 자바 가상 기계
프로그램이 메모리를 사용하는 방식

모든 프로그래밍 언어의 공통된 메모리 사용방식이다.

객체지향프로그램에서는 데이터 저장 영역을 다시 세 개의 영역으로 분할해서 사용한다. (T 메모리 구조)
자바에 존재하는 절차적 /구조적 프로그래밍의 유산
- 절차적 프로그래밍 == goto를 쓰지 말라는 것
- 자바의 예약어 (다른 언어의 const 역할을 자바에서는 final이 대신하고 있다)

- 자바에서 goto를 사용하지 않는 이유 : goto를 사용하게 되면 프로그램의 실행 순서가 인간이 이해하기에 너무 복잡해질 가능성이 있기 때문. 프로그램을 논리적으로 잘 구성하면 모두 피할 수 있는 것.
- 구조적 프로그래밍 == 함수를 쓰라는 것
- 함수를 쓰면 좋은 이유 : 중복코드를 한 곳에 모아서 관리할 수 있고, 논리를 함수 단위로 분리해서 이해하기 쉬운 코드를 작성할 수 있음.
- 공유 사용시 문제가 발생하기 쉬운 전역 변수보다는 지역 변수를 쓰라는 구조적 프로그래밍의 지침도 있다.
- 객체지향언어에서 절차적/구조적 프로그래밍의 유산은 메서드 안에서 확인할 수 있다. 제어문이 존재할 수 있는 유일한 공간이 매서드 내부이기 때문
- Q.함수와 메서드는 무엇이 다르냐? A. 전혀 다르지 않다. 굳이 차이점을 찾는다면 함수는 클래스나 객체와 아무 관계가 없지만 매서드는 반드시 클래스 정의 안에 존재해야 한다는 것. 객체지향에서 클래스 외부에 존재할 수 있는 것은 없다.


다시 보는 main() 매서드 : 매서드 스택 프레임
- main() 매서드는 프로그램이 실행되는 시작점.
- Start.java가 한 줄씩 실행될 때마다 T메모리 변화 살펴보기
public class Start{
public static void main(String[] args){
System.out. printIn("Hello OOP!!!");
}
}

- JRE는 먼저 프로그램 안에 main()매서드가 있는지 확인. JRE는 Start 클래스에서 main() 메서드를 발견할 것
- main() 메서드의 존재가 확인되면 JRE는 프로그램 실행을 위해 JVM에 전원을 넣어 부팅한다.
- JVM이 맨 먼저 하는 일을 전처리라고 한다. JVM은 가장 먼저 java.lang 패키지를 T 메모리의 스태틱 영역에 가져다 놓는다. (모든 자바프로그램은 java.lang 패키지를 포함한다

- JVM은 개발자가 작성한 모든 클래스와 임포트 패키지를 스태틱 영역에 가져다 놓는다.
💡
main() 메서드가 실행되기 전 JVM에서 수행하는 전처리 작업들 - java.lang 패키지를 T 메모리의 스태틱 영역에 배치한다. - import된 패키지를 T 메모리의 스태틱 영역에 배치한다. - 프로그램 상의 모든 클래스를 T 메모리의 스태틱 영역에 배치한다.

- main() 메서드의 스택 프레임이 스택영역에 할당된다. (여는 중괄호를 만날 때마다 스택 프레임이 하나씩 생긴다. 클래스 정의를 시작하는 중괄호 제외)

- 메서드의 인자 args를 저장할 변수 공간을 스택 프레임의 맨 밑에 확보.

- main() 메서드 안의 첫 명령문을 실행
- System.out. printIn("Hello OOP!!!") 구문이 실행된 후 T 메모리에는 아무런 변화가 없다.
Q. T 메모리에 변화가 없는 이유?
A. 여는 중괄호로 스택 프레임이 만들어지고 닫는 중괄호로 스택 프레임이 소멸된다. main() 메서드가 끝나면 JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다. 그럼 T 메모리도 이제 그 운명을 다하고 사라지게 된다.

변수와 메모리 : 변수! 너 어디 있니?
public class Start2 {
public static void main(String[] args) {
int i;
i = 10;
double d = 20.0;
}
}
- Start2.java의 2번째 줄을 실행한 후 T메모리

- 3번째 줄 실행 : 메모리에 4바이트 크기의 정수 저장 공간을 마련하라는 명령 main()메서드 스택 프레임 안에 밑에서부터 차곡차곡 변수 공간을 마련한다. 현재 변수 i 에는 쓰레기 값이 들어가 있다.

- 4번째 줄 실행

- 6번째 줄 실행 : 6번째 줄은 하나의 명령문이 아닌 두개의 명령문이다. 변수를 선언하는 명령문 + 변수에 값을 할당하는 명령문.

블록 구문과 메모리 : 블록 스택 프레임
public class Start3 {
public static void main(String[] args) {
int i = 10;
int k = 20;
if(i==10) {
int m = k+5;
k = m;
}
else {
int p = k+10;
k = p;
}
//k=m+p;
}
}
- 5번째 줄이 끝났을 때의 T메모리

- 6번째 if블록 : if는 조건에 따라 분기를 일으킨다. 조건이 참이라면 if~else블록 중 위의 블록이 실행될것. 여는 중괄호를 만나면 스택 프레임이 시작된다고 했는데 여기서 만들어지는 스택 프레임은 메서드의 스텍 프레임이 아니라 if문, 그것도 참인 블록의 스택 프레임이다.

- 7번째 줄 : int m = k+5;

- 8번째 줄 : k = m;

- 9번째 줄 : if 블록을 닫는 중괄호를 만나면 if블록 스택 프레임은 스택 영역에서 사라진다.

- 9~12번째 줄은 스택 메모리에 등장해 볼 기회조차 갖지 못했다..
- 14번째 줄은 주석으로 처리되어 있다. 만약 주석을 해재하면 m변수와 p변수가 가지고 있는 값을 더해 k변수에 대입하는 구문인데, 실행하면 컴파일러가 오류라며 컴파일을 거부한다.
- 15번째 줄에 있는 main() 메서드 스택 프레임을 소멸시키는 블록 마침 기호인 닫는 중괄호. T메모리 소멸, JVM기동 중지, JRE가 사용했던 시스템 자원을 운영체제에 반납하게 된다.
'Spring' 카테고리의 다른 글
02.자바와 절자척/구조적 프로그래밍_2 (1) | 2022.10.03 |
---|