Java는 다양한 장점을 가지고 있다.
객체 지향 프로그래밍(OOP): 추상화 , 캡슐화 , 다형성, 상속을 통해 코드의 재사용성 및 유지 보수가 용이합니다.
플랫폼 독립성: Bytecode로 컴파일되어 JVM에서 실행되므로 운영체제(OS)에 구애받지 않습니다.
안정성과 보안성: 자동 메모리 관리(GC)와 포인터 제거로 안전성을 높였습니다.
Java는 몇 가지 단점도 존재한다.
성능 제한: JVM 위에서 인터프리터 방식으로 실행되어 C/C++보다 속도가 느릴 수 있습니다.
높은 메모리 사용량: 가비지 컬렉션으로 인해 메모리 소모가 많을 수 있습니다.
Java는 한 번 컴파일된 바이트코드를 이후 JVM에서 인터프리터 방식으로 해석하며 실행하다가, 자주 실행되는 코드에 대해서는 JIT(Just-In-Time) 컴파일러를 사용해 네이티브 코드로 다시 컴파일합니다.
코드 작성: .java 파일 확장자로 소스 코드를 작성합니다.
컴파일: javac 컴파일러를 통해 소스 코드가 Bytecode로 변환됩니다. 이 과정에서 .class 파일이 생성됩니다.
Bytecode 실행: 생성된 .class 파일은 JVM이 읽어들여 기계어로 변환하며 프로그램이 실제로 실행됩니다. JVM을 통해 운영체제에 맞는 코드로 변환되기 때문에, 플랫폼에 구애받지 않고 동일하게 동작하게 됩니다.
Java Bytecode는 소스 코드가 컴파일될 때 생성되는 중간 코드이다.
Java Bytecode는 운영체제에 종속되지 않으며, JVM이 이를 해석하여 다양한 플랫폼에서 프로그램을 실행할 수 있도록 지원합니다. Bytecode는 .class 파일로 저장되며, JVM은 이 파일을 읽어 실행하게 됩니다.
Java는 인터프리터와 JIT(Just-In-Time) 컴파일 방식을 함께 사용한다.
처음에는 인터프리터가 바이트코드를 한 줄씩 읽어 실행하므로 빠르게 실행을 시작할 수 있습니다.
JIT 컴파일러는 반복 실행되는 부분을 기계어로 변환해 캐시에 저장하므로, 이후에는 더 빠르게 실행됩니다.
이렇게 두 방식을 결합해 초기 실행 속도와 성능 최적화를 동시에 잡은 방식입니다.
Java는 다양한 버전이 있으며, 각 버전은 고유의 특징을 가지고 있습니다.
Java 8: 람다 표현식과 스트림 API가 추가되어 Java에서도 함수형 프로그래밍이 가능해졌습니다. 덕분에 코드가 간결해지고, 컬렉션을 다루는 방식도 유연해졌습니다.
Java 11: 또 하나의 LTS 버전으로, var 키워드를 통해 지역 변수 타입 추론이 가능해졌고, 새로운 HTTP 클라이언트 API 도입으로 네트워크 코드 작성이 쉬워졌습니다.
Java 17: 최신 LTS 버전으로, 안정적인 최신 기능과 성능 개선이 돋보입니다. Sealed Class와 switch 표현식이 추가되어 상속 구조와 코드 작성이 더 깔끔해졌습니다.
저는 여러 강의와 프로젝트에서 JDK 17을 주로 사용했기 때문에 자연스럽게 이 버전을 주로 사용하게 되었고,
프로젝트와 라이브러리 호환성, 팀의 표준화, 장기 지원(LTS)이 보장되는 안정성, 특히 최근에는 스프링(Spring)과의 호환성 면에서도 JDK 17이 안정적이라는 점이 선택 및 사용에 큰 이유가 되었습니다.
JDK : 개발도구(JRE 포함) , JRE : 실행도구
JDK (Java Development Kit): Java 개발에 필요한 도구와 라이브러리를 포함하고 있는 개발자용 소프트웨어입니다. 컴파일러, 디버거, JRE 등이 포함되어 있어, Java 코드를 작성하고 테스트하는 데 필요한 환경을 제공합니다.
JRE (Java Runtime Environment): Java 애플리케이션을 실행하기 위한 환경입니다. JRE는 JVM과 필수 라이브러리들로 구성되어 있으며, Java 프로그램을 실행하는 데 필요한 최소한의 환경을 제공합니다.
JDK는 JRE를 포함하고 있지만, JRE는 개발 도구 없이 실행 환경만 제공하는 차이가 있습니다.