본문 바로가기

프로그래밍 언어/java

자바는 어떻게 동작하는가?

자바가 어떻게 동작하는지 알기 위해서는 일단 Java 플랫폼의 핵심 구성 요소에 대해서 알 필요가 있습니다.

다음은 자바의 핵심 구성요소에 대한 간단한 설명입니다.

  1. JDK (Java Development Kit)
     JDK는 Java 애플리케이션을 개발하기 위한 소프트웨어 개발 키트입니다.
    1. Java 컴파일러(javac)를 포함하여 소스 코드를 바이트코드로 변환합니다.
    2. 디버거, 아카이브 도구(jar) 등 개발에 필요한 다양한 도구를 제공합니다.
    3. JRE를 포함하고 있어 개발한 애플리케이션을 실행할 수 있습니다.
    4. Java API 문서와 소스 코드도 포함되어 있습니다.
  2. JRE (Java Runtime Environment)
    JRE는 Java 애플리케이션을 실행하기 위한 환경입니다.
    • JVM과 Java 클래스 라이브러리를 포함합니다.
    • 개발된 Java 프로그램을 실행하는 데 필요한 최소한의 환경을 제공합니다.
    • JDK와 달리 컴파일러 등의 개발 도구는 포함하지 않습니다.
  3. JVM (Java Virtual Machine)
    JVM은 Java 바이트코드를 실행하는 가상 머신입니다.
    • Java의 "Write Once, Run Anywhere" 원칙을 구현합니다.
    • 바이트코드를 해석하고 실행합니다.
    • 메모리 관리, 가비지 컬렉션 등을 담당합니다.
    • 플랫폼(OS) 종속적이지만, Java 코드의 플랫폼 독립성을 보장합니다.
  4. ClassLoader
    ClassLoader는 JVM의 일부로, Java 클래스와 인터페이스를 동적으로 로드하는 역할을 합니다.
    • 클래스의 바이트코드를 읽어 JVM의 메모리에 적재합니다.
    • 안정적인 실행환경을 위해 로드된 클래스의 무결성을 검증합니다.

이를 기반으로 자바의 실행과정을 알아봅시다.

자바의 실행 과정은 소스 코드를 작성하여 컴파일하고, 그 컴파일된 바이트코드를 실행하는 과정으로 이루어집니다. 자바는 플랫폼 독립적인 언어로, JVM(Java Virtual Machine)을 통해 다양한 운영체제에서 동일한 코드를 실행할 수 있는 특징을 가지고 있습니다. 자바의 실행 과정을 단계별로 살펴보면 다음과 같습니다.

자바 실행 과정 요약

  1. 소스 코드 작성: .java 파일을 작성.
  2. 컴파일: javac 컴파일러를 사용해 바이트코드(.class 파일)로 변환.
  3. 클래스 로딩: JVM의 클래스 로더가 .class 파일을 메모리로 로드.
  4. 바이트코드 실행: JVM이 인터프리터와 JIT 컴파일러를 통해 바이트코드를 실행.
  5. 런타임 환경 관리: JVM이 메모리 및 쓰레드 관리를 담당, 더 이상 참조되지 않는 객체를 메모리에서 해제(Garbage Collector).
  6. 프로그램 종료: 실행이 끝나면 JVM이 종료하고 메모리 자원을 반환.

1. 소스 코드 작성

  • 개발자는 자바 프로그래밍 언어로 소스 코드를 작성합니다. 소스 파일은 .java 확장자를 가집니다.
      public class HelloWorld {
          public static void main(String[] args) {
              System.out.println("Hello, World!");
          }
      }
    
  • 예를 들어, 아래는 간단한 자바 프로그램입니다:

2. 컴파일 (Compile)

  • 작성된 자바 소스 코드는 자바 컴파일러(javac)를 통해 바이트코드(bytecode)로 컴파일됩니다.
  • 컴파일된 바이트코드는 .class 확장자를 가지며, 이는 JVM에서 실행될 준비가 된 파일입니다.
  • javac HelloWorld.java
  • 이 명령을 실행하면 HelloWorld.class 파일이 생성됩니다. 이 .class 파일은 특정 운영체제나 하드웨어에 종속되지 않는 바이트코드로, 다양한 플랫폼에서 실행될 수 있습니다.

3. 클래스 로딩 (Class Loading)

  • 바이트코드 파일이 준비되면, 자바 런타임 환경(JRE: Java Runtime Environment) 내의 클래스 로더(Class Loader)가 이 바이트코드 파일을 메모리로 로드합니다.
  • 클래스 로더는 클래스 파일을 찾아서 JVM의 메모리에 적재하는 역할을 하며, 필요한 경우 의존하는 다른 클래스들도 함께 로드합니다.

4. 바이트코드 실행 (Bytecode Execution)

  • 클래스 로더에 의해 메모리로 로드된 바이트코드는 JVM에 의해 실행됩니다. 자바는 이 단계에서 플랫폼 독립성을 달성합니다.

5. 런타임 환경 (Runtime Environment)

  • JVM은 메모리 관리, 쓰레드 관리 등 프로그램이 실행되는 동안 다양한 작업을 처리합니다. JVM은 자바 프로그램이 실행되는 동안 아래의 중요한 영역들을 관리합니다.
  • JVM은 프로그램 실행 중 사용하지 않게 된 객체들을 자동으로 메모리에서 해제하는 가비지 컬렉터(Garbage Collector)를 사용합니다.

6. 프로그램 종료

  • 자바 애플리케이션의 실행이 끝나면, JVM은 모든 메모리를 해제하고 프로그램을 종료합니다.