JVMS21 공식문서 정리 - chapter2 (1)

응큼한포도·2024년 1월 9일

1. class file(.class)

자바 가상 머신(JVM)에서 실행되는 컴파일된 코드는 하드웨어 및 운영 체제와 독립적인 이진 형식으로 표현된다. 이 형식은 일반적으로 파일에 저장되며 클래스 파일 형식(.class 형태로) 이라고 한다.

클래스 파일 형식은 클래스나 인터페이스의 표현을 정확히 정의하며, 플랫폼별 객체 파일 형식에서 당연하게 여겨지는 바이트 순서 등과 같은 세부 사항을 포함한다. 여기서 중요한 건 class file이 특정 운영체제에 특정하지 않고 jvm만 있으면 실행가능하다는 사실

2. Data Types

우리가 사용하는 자바의 타입과 같이 jvm도 타입에 기본형참조형이 있다.
jvm에서도 변수에 저장되거나 인자로 전달되거나 메소드에서 반환되거나 연산되는 값은 이 2가지 타입이다.

jvm이 실행되기 전 타입 선언과 실제 값의 타입이 맞는지 확인하는 과정을 거치는 데 jvm이 하는 게 아니고 compiler가 먼저 해줘서 jvm이 타입 확인을 안해도 된다.

기본형(Primitive types)의 값들과 참조형은 실행 시점에 tag나 type을 확인하는 과정이 필요하지 않다. 대신 자바의 명령어 집합(operand)이 int, long, float, double과 같은 특정 타입의 숫자 값을 더하는 일을 수행해준다. 이렇게 타입에 따라 구분된 명령어들을 사용하여 JVM은 실행 시점에서 특정 타입의 값을 처리하고 연산한다.

즉 jvm은 타입검사 안하고 명령어를 이용해 각 타입에 맞는 연산을 해줘서 resource를 처리한다.

객체(object)는 jvm에서 객체 타입으로 인식된다. 참조 타입의 값은 객체를 가리키는 포인터로 생각할 수 있다.

3. Primitive Types and Values

jvm에서 기본 타입은 상수형(numeric types), 불리언(the boolean type), 반환 주소(the returnAddress type)을 갖는다.

상수형(numeric types)

상수형은 정수형과 실수형으로 나뉜다.

정수형
• byte, 8비트이고 양수, 음수를 가질 수 있다. 기본값(default)는 0
• short, 16비트이고 양수, 음수를 가질 수 있다. 기본값(default)는 0
• int, 32비트이고 양수, 음수를 가질 수 있다. 기본값(default)는 0
• long, 64비트이고 양수, 음수를 가질 수 있다. 기본값(default)는 0
• char, 16비트 양수인 정수로 기본적으로 UTF-16로 인코딩된 기본 다국어 평면의 유니코드 코드 포인트를 나타내며, 기본 값은 널 코드 포인트('\u0000')이다.

실수형
• float: 32비트 IEEE 754 binary32 형식으로 표현 가능한 값을 정확히 나타내며, 기본 값은 양의 제로(positive zero)이다.
• double: 64비트 IEEE 754 binary64 형식으로 표현 가능한 값을 정확히 나타내며, 기본 값은 양의 제로(positive zero)이다.

참고로 IEEE 754 표준에서는 0을 표현하는 데 두 가지 다른 형태의 제로를 사용한다. 양의 제로(positive zero)와 음의 제로(negative zero)로 알려져 있. 수학적으로 0은 부호가 없는 값이지만, 부동 소수점에서는 양의 제로와 음의 제로를 구별하기 위해 사용된다. 부동 소수점에서의 양의 제로는 비트가 0,음의 제로는 비트가 1로 설정 되어있다.

또한 Java SE 플랫폼은 특정 부동 소수점 타입의 NaN 값을 하나의 표준 값으로 취급한다. 이렇게 표준 값으로 취급되는 것은 특정 부동 소수점 타입의 NaN 값들이 서로 다른 값으로 구별되지 않고, 하나의 표준적인 값으로 간주되어 처리된다는 것을 의미함.

불리언(the boolean type)

boolean 타입의 값은 참(true)과 거짓(false)을 나타내며, 기본 값은 거짓(false)이다.
JVM에서는 불리언 값을 직접 다루는 명령어가 없다. 대신, JVM에서는 boolean 값을 표현하기 위해 int 타입을 사용하며, true는 일반적으로 1로, false는 일반적으로 0으로 처리된다. Java 코드에서 boolean을 다루는 연산은 컴파일러에 의해 int 값으로 변환되어 JVM에서 실행된다.

반환 주소(the returnAddress type)

returnAddress 타입이 기본(primitive) 타입 중 하나이지만 Java 프로그래밍 언어에서 직접적으로 사용되지 않는다. 이 타입은 JVM (Java Virtual Machine) 내부에서 명령어의 포인터를 다룰 때 사용된다. Java 프로그래머가 직접적으로 이 타입을 사용하는 것은 아니며, JVM이 내부적으로 명령어를 다루는 데에 사용된다.

0개의 댓글