
확장자가 .java인 소스코드 파일을 javac 라는 컴파일러를 통해 컴파일하여 확장자가 .class인 파일로 변환하여 자바 인터프리터를 통해 실행한다. 클래스는 자바 프로그램의 기본 단위로, 모든 문장은 클래스 안에 있어야 하고, main 메서드는 자바 프로그램의 시작점이다. 이 메서드 없이는 실행이 불가능하다. 객체는 heap에 저장되기 때문에 객체 할당 연산이 실행되는 순간 메모리가 할당이 되고 프로그램 실행 직후에는 어떠한 객체도 존재하지 않는다. 따라서 만약 main 메서드에 static이 붙지 않는다면 런타임 시작 시점에 메서드를 실행할 객체가 없어서 메서드 실행이 불가능하다. 따라서 static을 사용하여 객체의 생성 없이 메서드를 호출 가능하도록 하게 한 것이다.
자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.
자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.
확장자는 .class 이다.
자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있다.

개발자가 자바 소스코드(.java)를 작성한다.
자바 컴파일러가 자바 소스코드(.java)파일을 읽어 바이트코드(.class)코드로 컴파일 한다. 바이트코드(.class)파일은아직 컴퓨터가 읽을 수 없는 JVM(자바 가상 머신)이 읽을 수 있는 코드이다. (java - > class)
컴파일된 바이트코드(.class)를 JVM의 클래스로더(Class Loader)에게 전달한다.
클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area의 Method Area), 즉 JVM의 메모리에 올린다.
실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다. 이 때 실행 엔진은 두 가지 방식으로 변경한다.
인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다.
JIT컴파일러 : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 코드를 더이상 인터프리팅 하지 않고, 바이너리 코드를 직접 실행한다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠르다.
Java 17:
스프링부트 3과 호환되는 최소 자바 버전이 17임
자바 8, 11, 17은 모두 LTS(Long Term Support) 버전으로 장기간의 지원을 받는다.
동일성과 동등성은 객체 비교의 개념이다.
equals()는 본래 동일성 비교를 위해 사용되는 것인데 동등성 비교를 하기 위해서는 객체의 필드값이 같은지 비교하기 위해 오버라이딩을 통해 재정의해야 한다. 하지만 hashCode()는 보통 객체가 위치한 메모리 주소에 해시 함수를 적용한 결과값이므로 동등한 객체라고 해도 hashCode()값은 서로 다를 수 있다. 따라서 hashCode()도 재정의하여 필드값이 같으면 같은 해시코드 값을 갖도록 재정의해야 동등성 비교에 사용할 수 있다.
Object 클래스의 멤버 메소드로 객체의 문자열 표현을 반환하는 메서드이다.
형식: 클래스이름@객체 해시코드의 16진수 값
오버라이딩을 통해 재정의를 할 수 있다.
상수는 한 번만 값을 저장할 수 있는 공간이고, 리터럴은 그 자체로 값을 의미한다.
자바 변수는 기본형 혹은 참조형이다. 기본형은 자바에 정의되어 있는 8가지 문자, 숫자, 논리형 데이터형을 말하고, 기본형이 아닌 모든 데이터형은 참조형에 속한다. 참조형은 사용자가 직접 추가할 수 있으며, 변수에 객체의 메모리 주소를 저장한다.
자바의 매개변수 전달 방식은 Call by Value밖에 없다.
다만 기본형 타입은 값을 복사해서 넘겨주고, 참조형 타입은 참조값을 복사해서 넘겨준다.
자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술을 아울러서 이야기 한다.
JVM의 메모리에 저장된 객체 데이터를 꺼내서 바이트 형태로 변환하여 다른 프로세스와 통신하거나 외부 저장 매체(데이터베이스나 파일)로 저장하는 것이다.
자바의 기본형과 Serializable 인터페이스를 상속받은 객체는 직렬화할 수 있다.