Skip to main content

Java 언어

Java로 프로그램을 개발하기 시작하면서, Java 언어의 특징과 동작 원리 등을 자세히 알고싶어, 이를 정리해보려 한다.


Java

Java는 1991년에 James Gosling에 의해 개발되고, 1995년에 최초로 배포된 객체지향 프로그래밍 언어이자 소프트웨어 플랫폼이다. Java 언어는 애플리케이션과 게임 개발 등 여러 분야에 활용된다.


Java Components

JDK

JDK(Java Development Kit) 는 Java 언어로 application을 개발하기 위해 필요한 SDK(Software Development Kit) 이다.

JDK에는 JRE와 Development Tools가 포함된다.

참고로 SDK에는 다음의 종류가 포함된다.

  • Development Tools
    • Compilers
    • Debuggers
    • IDEs
  • Libraries
  • APIs
  • Documentation
  • Support

즉, JDK란 Java로 개발하기 위한 여러 툴과 API, 라이브러리 파일 등이 포함된 집합체라고 할 수 있다. 만약 JDK를 사용하지 않는다면, compile, debugging 등의 작업을 할 수 없고 Java application을 개발할 수 없다. 그래서 JDK는 무조건 설치를 해주어야 한다.

엄밀하게 말하면 Java application을 개발한다고 한다면, Java를 설치하는게 아니라(Java는 언어 그 자체이니), JDK를 설치해야한다. JDK는 release별로 https://www.oracle.com/java/technologies/downloads/에서 다운로드 받을 수 있다.


JRE

JRE(Java Runtime Environment)는 JDK의 일부로, JVM과 Java Class Libraries, Java Classloader를 포함하는 Java application의 실행을 위한 환경이다.

현대의 Java application이라 하면, JRE와 application을 결합한 형태지만, 아직도 호스트 머신에 Java가 설치 돼 있지 않은 경우, 올바로 동작하지 않는 웹 사이트가 많이 존재한다.

참고로 JRE의 Java Classloader는 Java의 class를 JVM으로 동적으로 로드하는 역할을 한다.


JVM

jvm

JVM(Java Virtual Machine)은 코드를 실행하고, 실행되는 런타임 환경을 제공하는 소프트웨어 프로그램이다. JVM의 설정을 변경해 어떻게 Java 프로그램을 실행할지 구성할 수 있다.

Java bytecode(.class 파일)를 파싱(parsing)하고 실행(interprets)하는 역할을 한다. 이때 Java bytecode는 Java source code(.java)가 Compile Time에 Java compiler(javac)에 의해 변환된 코드이다. Java bytecode의 실행은 실행 엔진(Execution Engine)에 의해 수행된다.

JVM에는 다음과 같이 2 가지 철학이 있다.

  1. ”Write once, run anywhere.”
    즉, 어떠한 디바이스, OS에도 실행가능하도록 한다.

  2. 프로그램 메모리 최적화
    Java 이전에는 모든 프로그램 메모리는 개발자에 의해서 관리되었다. Java에서는 JVM에 의해 메모리가 관리 되는데, 이러한 과정을 Garbage Collection이라고 한다. Garbage Collection이란, 계속해서 프로그램 내 사용되지 않는 메모리를 찾아 없애는 과정이다. 이러한 Garbage Collection은 실행중인 JVM 내에서 일어난다.

JVM에서는 다음의 작업들을 수행한다.

  • Loading the bytecode
    • JRE의 Java Classloader로부터 Java bytecode의 class를 System Memory 공간에 로드한다.
  • Verifying the bytecode
    • 읽어들인 bytecode의 유효성을 검증한다. (ex. 올바른 keyword 사용, 데이터 타입 등)
    • 이는 Linking time에 실행되며, 덕분에 interpreter가 실행될 때마다 제약 조건을 검증해야하는 비용을 줄일 수 있어, interpreter의 성능을 향상시킬 수 있다.
  • Preparing memory resources
  • JIT(Just-In-time) Compilation
    • Java bytecode를 Runtime 시에 Native Machine Code로 변환해준다.
    • JIT Compiler로 변환된 Native Machine Code는 캐싱이 된다.
    • 코드를 하나씩 실행하는 Interpreter의 단점을 보완하기 위해 사용되지만, 컴파일 시간이 Interpreter보다 오래 걸리기 때문에, 여러 번 사용되는 코드만 compile한다.
    • JIT Compiler 덕분에 추가적인 compile 필요 없이 platform-independent한 특성을 가진다.
    • Java class의 성능 향상시킨다.
    • empty method를 제거한다.
    • 지역변수의 레지스터 할당을 위한 영역을 정의한다.
    • C compiler가 필요없다.
  • Garbage Collection

JVM Stack
또한, 각 JVM thread마다 Stack이 존재하는데, 이를 JVM Stack이라고 한다. JVM Stack에는 Frame을 저장한다.


Frame
Frame은 부분적인 연산의 결과나 데이터를 저장할 때 사용하는데, 지역변수 혹은 method의 return 값이 여기에 저장된다. 또한, 새로운 메서드가 호출될 때마다 새로운 Frame이 생성된다.


Java 1.8 version === Java 8 version?

결론부터 말하자면 "우리 이렇게 개발 빠르게 진행한다"를 자랑하려고 Java 6, Java 7, Java 8 같이 쓴다. 이때의 6.0, 7.0, 8.0 같은 버전은 Product Version을 가리킨다.

Java 1.8 버전은 Developer Version을 가리킨다. 개발할 때 언급되는 버전이며 하위 버전과 일부를 제외하면 호환성 이슈는 없다.

Oracle 홈페이지에서는 버전명을 다음과 같은 이유로 변경했다고 한다.

The number 6 is used to reflect the evolving level of maturity, stability, scalability and security of Java SE

위 문장에서, maturity, stability, scalability, security 가 진화하는거랑 1.61.7 이랑 무슨 상관인지 이해가 되지 않는다. 그래놓고 내부적으로 개발자들 사이에서는 다음과 같이 부른단다.

Java SE keeps the version number 1.6.0 (or 1.6) in some places that are visible only to developers, or where the version number is parsed by programs

그러니까... 결국 보통 JDK를 설치하고 대부분 사용하는 사람들은 개발자들인데(visible only to developers), 이들한테는 1.6, 1.7, ... 으로 보여주고, 대외적으로 보여지는 이미지를 위해 6, 7을 쓰는게 아닌가?

결국 마케팅의 이유 때문....이구나. Java 6Java 7Java 1.6Java 1.7 보다 더 나으니까... 그만큼 "우리가 이렇게나 더 빠르게/발전시켜 개발한다"는걸 어필하기위한...

또 다른 재미난 블로그를 참고해보자. 제목이 참 인상깊다. J2EE or JEE, Java 5 or Java 1.5 – Is SUN Crazy?.

Related Links