JVM(Java Virtual Machine)
JVM은 자바 프로그램을 실행시키는 도구로, 바이트코드를 운영체제에 맞는 기계어로 변환해준다.
자바에서의 컴파일은 자바 언어를 JVM(Java Virtual Machine)이 이해할 수 있는 코드(바이트코드, Bytecode)로 변환하는 것을 의미한다.
자바가 운영체제에 독립적인 것은 JVM이 있기 때문에 가능하다. JVM은 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램이다. 즉, 프로그램을 실행하는 프로그램이다.
프로그램이 제대로 실행되기 위해서는 컴퓨터의 다양한 자원(CPU, RAM, 각종 입출력 장치 등)을 활용해야 한다. 이런 자원을 관리하는 것은 운영체제이므로, 프로그램은 운영체제의 정책을 따라야 한다.
서로 다른 운영체제(Linux, Windows, MacOS 등)에서 프로그램을 실행하기 위해서는 운영체제별 규칙을 따르는 별도의 절차가 필요하다. JVM은 이 문제를 해결할 수 있다. JVM의 경우 JDK나 JRE를 설치하면 자동으로 설치된다. 자바는 JVM을 거치기 때문에 C나 C++에 비해 속도가 느리다. 하지만 JVM 내부의 최적화된 JIT 컴파일러를 통해 속도를 크게 개선하고 있다.
JDK(Java Development Kit)
JRE(Java Runtime Environment) : JVM + 표준 클래스 라이브러리
JDK(Java Development Kit) : JRE + 개발에 필요한 도구
만약 자바 프로그램을 실행만 할 것이라면 JRE만 설치해도 상관없다. 그러나 우리는 자바 프로그램을 개발할 것이기 때문에 JDK를 설치해야 한다. JDK는 OracleJDK와 OpenJDK가 있다. 이 둘은 여러 차이가 있지만 지금은 OracleJDK는 오라클이라는 회사에서 관리하는 버전이고 OpenJDK는 오픈소스라는 것만 알아두어도 코드를 작성하는 데에는 문제가 없다.
자바 변수명
일반적으로 자바에서 변수명은 카멜 케이스(camelCase)를 사용한다. 카멜케이스란 낙타 등 모양을 비유해서 붙여진 이름으로, 두 번째 단어부터 대문자로 시작해 구분한다.
데이터 타입별로 차지하는 메모리 공간의 크기와 표현할 수 있는 값의 범위
이외에 boolean은 참과 거짓을 표현하는 자료형으로 1bit만 있으면 되지만, JVM이 다룰 수 있는 데이터의 최소 단위가 1byte이기 때문에 boolean형은 1byte(8bit)의 크기를 가진다.
오버플로우 : 자료형이 표현할 수 있는 범위 중 최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환한다.
언더플로우: 자료형이 표현할 수 있는 범위 중 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환한다.
자동 형변환
바이트 크기가 작은 타입에서 큰 타입으로 변환할 때 (예 : byte → int)
덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 (예 : 정수 → 실수)
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
강제(수동) 형변환
캐스팅이라고 한다.
강제 형변환은 바이트 크기가 큰 타입에서 작은 타입으로 변환할 때(예 : int→ char)
(타입명)변수명 과 같이 사용한다.
ex)
int intValue = 128;
byte byteValue = (byte)intValue;