Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(JVM) 바이트코드 검증(Verification) 과정 완벽 이해

자바 프로그램이 실행되기 위해서는 소스 코드가 컴파일되어 .class 파일로 생성되고, 이 파일에 담긴 바이트코드가 JVM(Java Virtual Machine)에 의해 로딩됩니다. 바이트코드가 클래스 로더를 통해 메모리에 적재되면, 곧바로 실행되는 것이 아니라 검증기(Verifier)라는 특별한 구성 요소를 거치게 됩니다.

검증기는 로드된 바이트코드가 자바 언어 명세와 JVM 규격에 맞는 유효한 코드인지 확인하는 역할을 합니다. 구체적으로는 스택 오버플로우나 언더플로우 여부, 타입 변환의 적합성, 잘못된 메서드 호출이나 접근 권한 위반 등을 점검합니다.

검증 단계가 중요한 이유

이러한 검증 작업은 크게 두 가지 이유에서 매우 중요합니다.

  • 보안성 확보: 악의적으로 조작된 바이트코드가 시스템에 피해를 주는 것을 사전에 차단합니다.
  • 효율적인 링킹과 실행: 클래스 링킹(linking) 단계에서 문제없이 연산이 수행될 수 있도록 보장하여, 인터프리터가 더 빠르고 안정적으로 바이트코드를 해석할 수 있게 합니다.

이처럼 바이트코드의 유효성을 점검하는 일련의 과정을 검증(Verification)이라고 부릅니다.

예제 코드

public class Demo{
    private float my_val;
    float my_function(int my_val){
        int balance = my_val;
        this.my_val += balance;
        return this.my_val;
    }
    public static void main(String[] args){
        Demo my_obj = new Demo();
        System.out.println("The instance of Demo has been created");
        System.out.println(my_obj.my_function(3456));
    }
}

실행 결과

The instance of Demo has been created
3456.0

코드 설명

Demo라는 이름의 클래스에는 float 타입의 필드 하나가 선언되어 있습니다. 그리고 my_function이라는 메서드는 매개변수로 전달받은 정숫값을 float 필드에 더하는 역할을 합니다.

main 메서드 안에서는 먼저 Demo 클래스의 인스턴스를 생성하고, 해당 객체에 대해 my_function 메서드를 호출하여 결과를 반환받습니다. 인스턴스 생성 완료 메시지와 함께 계산된 값이 콘솔에 출력되며, 정수 3456이 float 타입으로 자동 형 변환되어 3456.0으로 표시되는 것을 확인할 수 있습니다.