Java

자바 코어 (3) – JVM과 플랫폼 독립성

gentle-tiger 2025. 6. 7. 21:41
프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다. 

 

JVM과 플랫폼 독립성

 

  1. Java 플랫폼이 독립적인 이유는 무엇입니까?
  2. Java의 가장 중요한 기능은 무엇입니까?
  3. 플랫폼 독립성이란 무엇을 의미합니까?
  4. JVM이란 무엇입니까?
  5. JVM은 플랫폼 독립적입니까?
  6. JDK와 JVM의 차이점은 무엇입니까?
  7. Java에서 this()와 super()의 차이점은 무엇입니까?

 

 

 

Java 플랫폼이 독립적인 이유는 무엇입니까?

Java 플랫폼이 독립적인 이유는 자바 프로그램이 직접 운엥체제나 CPU와 대화하지 않고 JVM이라는 가상의 하드웨어 위에서만 동작하도록 설계되었기 때문입니다. 즉, 개발자는 파일 시스템, 네트워크, 스레드 같은 기능을 모두 JVM이 추상화한 표준 API로 사용하고, 각 운영체제는 자기 환경에 맞는 JVM 구현체만 제공하면 되므로, 동일한 프로그램을 한 번 작성하면 JVM이 설치된 곳 어디서나 실행할 수 있기 때문입니다. 

 

 

Java의 가장 중요한 기능은 무엇입니까?

플랫폼 독립성을 가장 중요한 기능으로 꼽을 수 있습니다. 다양한 운영체제 환경에서 동일한 코드 기반으로 배포 및 유지보수가 가능할 수 있으며, Spring Freamwork, Hadoop, Android 등 다양한 기술 스택과도 연동되며, 서버 사이드 백엔드부터 모바일까지 확장 가능하다는 장점이 있어 Java를 채택합니다. 

 

 

플랫폼 독립성(platform independence)이란 무엇을 의미합니까?

플랫폼 독립성이란 애플리케이션이 운영체제나 하드웨어 아키텍처에 영향을 받지않고 동일한 실행 결과를 보장할 수 있는 특성을 의미합니다. Java는 소스 코드 → 바이트코드 → JVM 실행이라는 구조로 이 특성을 실현하는데, JVM은 각 플랫폼에 맞는 native 코드로 바이트코드를 변환하므로, 개발자는 OS와 아키텍처에 의존하지 않는 추상적인 코드 실행이 가능합니다.

 

 

JVM이란 무엇입니까?

JVM(Java Virtual Machine)은 Java 바이트코드를 실행하여 Java 애플리케이션의 런타임 환경을 제공하는 가상 머신입니다. 플랫폼에 종속되지 않은 바이트코드를 해석하거나 컴파일하여 운영체제에 맞는 네이티브 명령으로 변환합니다. JVM은 클래스 로더 서브시스템을 통해 바이트코드를 동적으로 로딩하고, 실행 엔진을 통해 이를 해석(Intepreter)하거나 JIT 컴파일러를 통해 성능을 최적화한 기계어로 변환합니다. 실행 중에는 GC(Garbage Collector)를 통해 불필요한 객첼르 자동으로 회수하며, 이를 통해 실행 흐름 및 메모리를 관리합니다. 개발자는 하드웨어나 운영체제를 고려하지 않고도 에플리케이션을 구현할 수 있습니다.  

JVM 내부 작동 방식 

바이트코드 (.class)
   ↓
클래스 로더 (Class Loader)
   ↓
런타임 데이터 영역에 적재 (메서드 영역, 힙, 스택 등)
   ↓
실행 엔진(Execution Engine)
   ↳ 인터프리터: 한 줄씩 읽어 실행
   ↳ JIT 컴파일러: 자주 실행되는 코드를 네이티브 코드로 컴파일
   ↓
결국 OS 위에서 네이티브 코드가 실행됨

 

 

JVM은 플랫폼 독립적입니까?

JVM 자체는 플랫폼에 종속적입니다. 예를 들어, Windows용 JVM과 Linux용 JVM은 서로 다른 바이너리로 제공되며 OS API 호출 방식이 다릅니다. 하지만 JVM이 바이트코드를 표준 방식으로 설계되어 있기 때문에, 개발자가 작성한 Java 애플리케이션은 JVM만 설치되어 있다면, 어떤 플랫폼에서도 동일하게 동작할 수 있습니다. 따라서 플랫폼이 독립적인 것은 Java 바이트코드와 JVM 환경의 조합이지 JVM 그 자체는 아닙니다. 

 

JDK와 JVM의 차이점은 무엇입니까?

항목 JVM (Java Virtual Machine) JDK (Java Development Kit)
목적 Java 바이트코드 실행 Java 애플리케이션 개발 및 실행
포함 항목 Execution Engine, GC, Class Loader 등 JVM + 컴파일러(javac), 디버거(jdb), JAR 툴 등
사용 시점 런타임 환경 구성 컴파일, 디버깅, 패키징 등 개발 전체 과정
예시 java HelloWorld 명령으로 실행 javac HelloWorld.java로 컴파일

JVM은 Java 애플리케이션을 실행하기 위한 런타임 환경으로, 컴파일된 바이트코드를 운영체제에 맞는 기계어로 변환하여 실행하는 역할을 합니다. 클래스 로더, 실행 엔진, 가비지 컬렉터 등이 포함되어 있으며, 순수하게 실행에만 관여합니다.

반면, JDK(Java Development Kit)는 JVM을 포함하여 Java 애플리케이션을 개발하기 위한 도구 전체를 묶은 개발 키트입니다. 여기에는 Java 컴파일러(javac), 디버거(jdb), JAR 생성 도구 등과 같은 빌드 및 디버깅 도구가 포함되어 있어 소스 코드 작성부터 컴파일, 실행, 배포까지 전 과정을 지원합니다. 

요약하면, JDK = JVM + 개발 도구로 구성되며, 개발자는 JDK만 설치하면 Java 애플리케이션의 작성부터 실행까지 모든 작업이 가능합니다. JVM은 그 내부에서 바이트코드를 해석·실행하는 핵심 실행 환경이며, java 명령을 통해 동작하게 됩니다.

 

 

Java에서 this()와 super()의 차이점은 무엇입니까?

항목 this() super()
용도 같은 클래스의 다른 생성자 호출 부모 클래스의 생성자 또는 메서드 호출
위치 생성자 내부 첫 줄 생성자 내부 첫 줄 또는 메서드 내부
사용 목적 생성자 오버로딩 시 코드 중복 제거 상속받은 기능 초기화 또는 접근

this()와 super()는 모두 생성자 내부에서 사용되는 키워드이지만, 그 목적과 대상이 다릅니다. this()는 같은 클래스 내의 다른 생성자를 호출할 때 사용하며, 생성자 간 코드 중복을 줄이고 공통 초기화를 위함입니다. 반면 super()는 부모 클래스의 생성자를 호출할 때 사용되며, 상속받은 필드나 기능의 초기화를 위해 사용됩니다. 두 키워드 모두 생성자의 첫 줄에서만 호출 가능하며, 동시에 사용할 수 없습니다. 즉, this()는 동일 클래스 내 생성자 호출, super()는 상위 클래스 생성자 호출이라는 차이가 있으며, 올바른 객체 초기화를 위해 적절한 위치에 사용되어야 합니다.

 

this 예시 코드

public class Person {
    String name;
    int age;

    Person() {
        this("Unknown", 0); // 다른 생성자 호출
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

super() 예시 코드 

public class Employee extends Person {
    String department;

    Employee() {
        super("John", 30); // 부모 생성자 호출
        this.department = "HR";
    }
}