본문 바로가기
IT/Java

JVM, 자바는 컴퓨터에서 어떻게 실행되는가

by Cyber_ 2024. 11. 21.

1. Java

자바는 "한 번 작성하면 어디서나 실행된다(Write Once, Run Anywhere)"는 철학 아래 설계된 언어로, 다양한 플랫폼에서 자바 프로그램을 실행할 수 있게 해줍니다. 이를 가능하게 하는 핵심요소가 JVM입니다.

2. 소스코드작성

public class HelloWorld {
    public static void main(Stringp[] args){
        System.out.println("Hello, World!");
    }
}

 

1) 왜 Java는 main 메서도를 Hellow world와 같은 클래스 안에 포함시키는가
Java는 객체 지향 프로그래밍 언어이므로 모든 코드는 클래스 안에 있어야 합니다. 이 메소드가 포함된 클래스의 이름은 중요하지 않으나, Java프로그램을 실행할 때, 이 클래스 이름을 사용하여 main 메소드를 찾아 실행합니다.


2) 왜 main 메소드는 String[] args를 변수로 받으며, 변수명은 왜 args인가?

main 메소드가 Stringp[] args를 매개변수로 받는 이유는 프로그램 실행 시에 커맨드 라인을 통해 입력받은 인자들을 처리하기 위함입니다. 여기서 args는 "arguments"의 줄임말로, 전달되는 인자들을 담는 문자열 배열입니다. 변수명은 args가 관례 적으로 사용되나, 다른 이름을 사용해도 기능상 문제는 없습니다.

3. 컴파일 과정

작성한 소스 코드는 자바 컴파일러(javac)에 의해 바이트코드라는 중간 형태의 코드로 변환됩니다. 바이트코드는 특정 하드웨어나 운영체제에 종속되지 않는 형태의 코드로, .class 파일에 저장됩니다. 위 에제를 컴파일 하면 HelloWorld.class 파일이 생성됩니다.

 

1) 컴파일이란?
컴파일은 고급 언어로 작성된 소스 코드를 저급 언어(예: 기계어)로 변환하는 과정입니다. 자바에서는 소스코드파일 .java 를 바이트코드 .class로 변환하는 과정을 말합니다. 이 바이트 코드는 독립적이며 JVM에서 해석되어 실행됩니다.

 

2) 코드를 Run하는 순간 자바컴파일러는 어디에서 실행되는가?
자바 컴파일러(javac)는 일반적으로 사용자의 운영체제 위에서 동작하는 소프트웨어에서 실행됩니다.

4. 자바 가상 머신(JVM)

컴파일된 바이트 코드는 JVM에서 실행됩니다. JVM은 바이트 코드를 받아들여 각 플랫폼에 맞게 기계어로 번역(Junt-In-Time 컴파일)하고, 실행합니다. 이 과정에서 JVM은 메모리 관리, 쓰레드 관리, 예외 처리 등의 다양한 작업을 수행합니다.

 

1) JVM은 어디에서 실행되는가?
JVM은 사용자의 운영 체제에서 실행됩니다. 해당 운영체제에 적합한 JVM이 설치되어 있어야 하며, 이는 바이트코드를 받아 실행가능한 기계어로 변환합니다.

 

2) 바이트코드의 플랫폼 독립성
자바의 바이트코드는 플랫폼에 독립적입니다. 즉, 한 운영체제에서 컴파일된 .class 파일을 다른 운영체제에서도 동일하게 실행할 수 있습니다.

 

3) 자바 컴파일과정과 JVM 분리 이유

  • 플랫폼 독립성: 자바 소스코드를 바이트 코드로 컴파일하는 과정이 분리되어 있기 때문에, 한 번 컴파일된 바이트 코드는 어떤 JVM에서도 실행될 수 있습니다.
  • 보안 및 최적화: JVM은 바이트 코드를 검증하고 최적화 하는 과정을 거칩니다. 이는 실행 시간 동안 발생할 수 있는 보안 문제를 사전에 차단하고, 성능을 개선하기 위함입니다.
  • 동적 로딩과 링킹: JVM은 클래스를 필요로할 때마다 동적으로 로딩하고 링킹할 수 있습니다. 이는 프로그램 실행 중에 새로운 코드를 추가하거나 기존 코드를 변경할 때 유연성을 제공합니다.

5. 각 운영체제에서 기계어 처리

운영체제는 하드웨어와 소프트웨어 사이의 중재자 역할을 합니다. 컴퓨터의 CPU는 특적 기계어 코드만을 이애하고 실행할 수 있습니다. 운영체제는 프로그램으로 부터 받은 명령을 하드웨어가 이해할 수 잇는 기계어로 변환하고, 그 결과를 프로그램에 전달합니다.

  • 명령실행: 각 운영체제는 자신이 설치된 특정 하드웨어 아키텍처의 기계어 명령을 실행할 수 있도록 설계되어 잇습니다. 예를 들어, x86 아키첵처의 CPU에서 실행되는 Windows는 x86 명령어 세트를 이해하고 처리할 수 있습니다.
  • 시스템 호출: 프로그램이 파일 시스템 접근, 네트워크 통신, 메모리 관리 등의 작업을 요청할 때, 이는 시스템 호출을 통해 운영체제에 의해 처리됩니다. 운영체제는 이러한 요청을 기계어로 번역하여 CPU에 전달하고, 실행 결과를 다시 프로그램에 반환합니다.

6. 실행

최종적으로, JVM은 HelloWorld.class파일을 로드하고, main 메소드를 호출하여 프로그램을 실행합니다.