01_자바 프로그램의 개발과 구동
- JVM(Java Virtual Machine)의 존재와 역할을 아는 것이 자바 개발 환경을 이해하는 데 필수적이다. JVM은 이름 그대로 가상기계다. 현실 세계에서 컴퓨터를 구동하기 위해서는 물리적 컴퓨터인 하드웨어와 운영체제, 그리고 그 위에서 구동될 소프트 웨어가 필요하다. 거기에 더해 소프트웨어를 개발할 수 있는 개발도구가 필요하다. 자바의 가상 세계는 이러한 현실 세계를 그대로 모방하고 있다.
현실세계 | 가상 세계(자바월드) | |
소프트웨어 개발 도구 | JDK - 자바 개발 도구 | JVM용 소프트웨어 개발 도구 |
운영 체제 | JRE - 자바 실행 환경 | JVM용 OS |
하드 웨어 - 물리적 컴퓨터 | JVM- 자바 가상 기계 | 가상의 컴퓨터 |
현실 세계에서 소프트웨어, 즉 프로그램은 개발자가 개발 도구를 이요해 개발하고 운영체제를 통해 물리적 컴퓨터인 하드웨어 상에서 구동된다. 자바 개발 도구인 JDK를 이용해 개발된 프로그램은 JRE에 의해 가상인 컴퓨터인 JVM상에서 구동된다.
- JDK는 자바 소스 컴파일러인 javac.exe를 포함하고 있고, JRE는 자바 프로그램 실행기인 java.exe를 포함하고 있다.
=>기존 언어로 작성한 프로그램은 윈도우 95용, 윈도우 xp용, 윈도우 7용, 윈도우 8용, 리눅스용, 애플 맥 OS X 용 등 각 플랫폼용으로 배포되는 설치 파일을 따로 준비해야 했던 불폄함을 없애주었다.
즉, 자바 개발자는 본인이 사용 중인 플랫폼에 설치된 JVM용으로 프로그램을 작성하고 배포하면 각 플랫폼에 맞는 JVM이 중재자로서 각 플랫폼에서 프로그램을 구동하는 데 아무 문제가 없게끔 만들어 준다.
참고로 JDK, JRE, JVM의 원래 명칭은 아래 표와 같다.
JDK | JRE | JVM |
Java Development Kit | Java Runtime Environment | Java Virtual Machine |
자바 개발도구 | 자바 실행환경 | 자바 가상 기계 |
- 자바를 더 잘 활용하기 위해 먼저 살펴볼 것은 프로그램이 메모리를 사용하는 방식이다.
프로그램이 메모리를 사용하는 방식이다.
코드 실행 영역 | 데이터 저장 영역 |
객체 지향 프로그램에서는 데이터 저장 영역을 다시 세 개의 영역으로 분할해서 사용한다.
(데이터 저장 영역은 T처럼 보이기 때문에 앞으로 T 메모리 구조라고 간략하게 지칭)
코드 실행 영역 | 스태틱(Static) 영역 | |
스택(Stack) 영역 | 힙(Heap) 영역 |
02_자바에 존재하는 절차적 / 구조적 프로그래밍의 유산
- 객체 지향 언어에서 절차적/ 구조적 프로그래밍의 유산은 메서드 안에서 확인할 수 있다. 객체 지향 프로그래밍에서 제어문이 존재할 수 있는 유일한 공간은 바로 메서드 내부이기 때문이다.
함수(Function)과 메서드(Method)는 전혀 다르지 않다 .
절차적/ 구조적 프로그래밍에서 함수라 불렀는데 객체 지향에서는 좀 다르게 부르기 위해 메서드라고 부른다. 굳이 차이점을 찾자면, 함수는 클래스나 객체와 아무 관계가 없지만 메서드는 반드시 클래서 정의 안에 존재해야 하는 것이다.
객체 지향에서 import 구문 없이 존재할 수 있는 것은 없다. => import 문은 타이핑을 적게 하기 위한 편의 기능일 뿐.
03_ 다시 보는 main() 메서드 : 메서드 스택 프레임
- main 메서드는 프로그램이 실행되는 시작점이다. 예제를 통해 Start.java가 한 줄씩 실행될 때마다 T메모리가 어떻게 변화하는지 살펴보자.
JRE는 먼저 프로그램 안에 main()메서드가 있는지 확인한다. 메서드의 존재가 확인되면 JRE는 프로그램을 실행을 위한 사전 준비를 착수하고, 가상의 기계인 JVM에 전원을 넣어 부팅한다. JVM이 맨 먼저 하는 일은 전처리라고 하는 과정이다. JVJM은 모든 자바 프로그램이 반드시 포함하게 되는 java.lang 패키지를 T 메모리의 스태틱 영역에 가져다 놓는다.
java.long 패키지가 있기에 System.out.println() 같은 메서드를 사용할 수 있다.
JVM은 개발자가 작성한 모든 클래스와 임포트 패키지를 스태틱 영역에 가져다 놓는다.
(현재 코드에서 클래스는 Srart밖에 없으니 T 메모리에 main(args:String[]만 배치된다. ))
main()메서드가 실행되기 전 JVM에서 수행하는 전처리 작업들
1. java.lang 패키지를 T 메모리의 스태틱 영역에 배치한다.
2. import 된 패키지를 T 메모리의 스태틱 영역에 배치한다.
3. 프로그램 상의 모든 클래스를 T 메모리의 스태틱 영역에 배치한다.
메서드들의 놀이터는 스택이다. main() 메서드가 놀기 위해 스택 프레임(stack frame)이 스택 영역에 할당된다. 조금 더 정확히는, 여는 중괄호를 만날 때마다 스택 프레임이 하나씩 생긴다. 그리고 메서드의 인자 args를 저장할 변수 공간을 스택 프레임의 밑에 확보해야 한다. 즉, 메서드 인자(들)의 변수 공간을 할당하는 것이다.
위 그림처럼 T 메모리를 구성하고 나서야 main() 메서드의 안의 첫 명령문을 실행하게 된다.
2번째 줄의 블록 시작 기호인 여는 중괄호를 만났을 때 main() 메서드의 스택 프레임이 생긴다고 했다. 이후에 세번째 줄도 실행하고, 4번째 줄에서 main() 메서드의 끝을 나타내는 닫는 중괄호와 만난다. 여는 중괄호로 스택 프레임이 만들어지고 닫는 중괄호로 스택 프레임이 소멸된다. 아래 그림은 main() 메서드의 스택 프레임이 소멸된 후의 T 메모리를 보여준다.
main() 메서드가 끝나면 JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다.
중요 키워드
1. T 메모리 구조
2. java.lang 패키지
3. import 패키지와 클래스들
4.메서드 스택 프레임
5. JVM
6. JRE
04_ 변수와 메모리 : 변수! 너 어디있니?
- 이 명령은 메모리에 4바이트 크기의 정수 저장 공간을 마련하라는 것이다.
3번째 줄과 같이 변수 i를 선언만 하고 초기화지 않은 상태에서 i 변수를 사용하는 코드를 만나면 자바 컴파일러 (javac)는 "The local variable i may not been initialized" 경고를 토해낸다.
그리고 아래 그림과 같이 7번째 줄의 닫는 중괄호로 main() 메서드 스택 프레임이 스택 영역에서 사라진다.
변수가 어디있는지는 ' 지역 변수와 메모리 ' 절에서 확인할 수 있다.
05_ 블록 구분과 메모리 : 블록 스택 프레임
변수를 초기화 했으면 다음으로 실행해야 하는 부분은 8번째 줄의 if 블록이다.
if는 조건에 따라 분기를 일으킨다. i 변수의 결과값이 true이면 if ~ else 중 위의 블록이 실행될 것이다. 그리고 여는 중괄호를 만나면 스택 프레임이 시작된다고 했는데, 여기서 만들어지는 스택 프레임은 메서드의 스택 프레임이 아니라 if문, 그것도 참인 블록의 스택 프레임이다.
m = k +5 구문은 if 스택 프레임 안에 변수 m에 값을 할당한다. 이때 if 스택 프레임 밖에 있으면서 main() 메서드 프레임 안에 있는 k 변수를 참여시킨다.
11번째 줄에서 if 블록 중 참일 때의 블록을 종료하는 닫는 중괄호를 만나면 if 블록 스택 프레임은 스택 영역에서 사라진다. 이 때 if 블록 스택 프레임 안에 상주하던 변수의 저장 공간도 함께 사라진다.
16째 줄은 주석으로 처리돼 있다. 만약 주석을 해제하면, m 변수와 p 변수는 이제 존재하지 않는다. 그러니 주석을 풀고 실행하면 컴파일러가 오류라면 컴파일을 거부한다.
17번째 줄에 도착하면 main() 메서드 스택 프레임을 소멸시키는 블록 마침 기호인 닫는 중괄호가 보인다. 여기서는 T 메모리 소멸, JVM 기동 중지, JRE가 사용했던 시스템 자원을 운영체제에 반납하게 된다.
'Java' 카테고리의 다른 글
자바와 객체 지향(캡슐화 : 정보 은닉) (0) | 2024.05.04 |
---|---|
자바와 객체 지향 (다형성 : 사용편의성) (0) | 2024.05.04 |
자바와 객체 지향 (상속 : 재사용 + 확장) (0) | 2024.05.04 |
자바와 객체 지향 (추상화 : 모델링) (0) | 2024.05.04 |
자바와 절차적 / 구조적 프로그래밍 (6-11) (0) | 2024.05.04 |