1. 자바 프로그램 실행 과정
자바 파일을 컴파일러가 해석하면서 자바 바이트 코드로 번역을 합니다.
번역된 자바 바이트 코드를 JVM이 읽고 실행합니다.
Java 바이트 코드란?
: JVM이 이해할 수 있는 언어로 번역된 자바 소스 코드를 말합니다. 바이트라는 이름이 붙은 것은 변환되는 코드의 명령어 크기가 1바이트라서 바이트 코드라고 합니다.
JVM이란?
: Java Virtual Machine의 줄임말입니다. Write once, run everywhere 즉, OS마다 따로 코드를 작성해야 하는 번거로움 없이 코드를 짜면 어떤 운영체제에서든, 어떤 하드웨어에서든 실행될 수 있게 해주는 것이 JVM입니다.
: 예를 들어, C로 짠 프로그램은 바로 기계어로 컴파일하믈 하드웨어 기종에 맞게 컴파일 해주어야 합니다. 이를 플랫폼에 종속적이라고 표현합니다. 반면 Java로 짠 프로그램은 자바 바이트 코드로 컴파일하여 JVM으로 실행되기 때문에, JVM이 설치된 OS라면 하드웨어가 컴퓨터, 스마트폰 등 어떤 기종이든 상관없이 단 한번만 컴파일하면 됩니다. 이를 플랫폼에 독립적이라고 표현합니다.
: 여기서 JVM은 자바 클래스 파일을 로드하고 바이트 코드를 해석하며, 메모리 등의 자원을 할당하고 관리하며 정보를 처리하는 작업을 하는 프로그램입니다.
클래스 로더 시스템
- 로딩: 클래스를 읽어오는 과정
- 링크: 래퍼런스를 연결하는 과정
- 초기화: static값들을 초기화 및 변수에 할당하는 과정
메모리
- Stack: Thread마다 런타임 Stack 생성 -> Thead가 종료되면 Stack 초기화
- PC(Program Counter) registers: Thread 내에서 현재 실행할 Stack Frame을 가리키는 포인터
- Navice Method Stack: C/C++로 구현된 라이브러리를 사용할 때 JNI(Java Native Method Interface)로 Native Method Library를 사용
- 힙 영역: 객체(인스턴스)를 저장 및 공유
- 메서드 영역: 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장
Native Method
- Native Method Interface: 자바 어플리케이션에서 C/C++ 등 언어로 작성된 함수를 사용할 수 있는 인터페이스 제공
- Native Method Library: C/C++로 작성된 라이브러리
실행 엔진
- Interpreter: 바이크 코드를 기계가 이해할 수 있는 Native Code로 바꾸는 번역하는 작업을 수행
- JIT(Just In Time) Compiler: 인터프리터의 효율을 높이기 위해 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 Native Code 번역하는 작업을 수행
- GC: 더이상 참조되지 않는 객체를 정리하는 작업 수행
2. 자바의 기본 구조
package com.sparta.entity;
import java.util.*;
public class HelloJava() {
public static String HelloWorld() {
return "Hello World!";
}
public static int Sum(int a, int b) {
return i + j;
}
public static void main(String[] args) {
String helloWorld = new HelloWorld();
System.out.println(helloWorld); // "HelloWorld" 출력
int sum = new Sum(10, 20);
System.out.println(sum); // 30 출력
}
}
- Package: 자바 소스파일을 기능별로 분류하는 방법 + 클래스명이 충돌하지 않게 하는 역할도 수행
- Import: 다른 패키지에 있는 클래스를 불러와서 사용하겠다는 표시
- public static void main(String[] args) { ... }: 객체의 생성 및 사용
- int sum = new Sum(10, 20): new 연산자를 사용하여 Sum 객체 생성한 뒤, sum에 30이라는 값을 리턴해주는 Sum class를 수행
- String helloWorld = new HelloWord(): new 연산자를 사용하여 HelloWorld 객체를 생성한 뒤, helloWorld에 "Hello World!"라는 값을 리턴해주는 HelloWorld를 수행
- System.out.println(): 값을 출력해주고 개행문자까지 실행하는 메서드