Java란?
컴퓨터, 소프트웨어 기술을 제공하는 미국 Sun MicroSystems에서 James Gosling과 그의 동료들이 개발한 프로그래밍 언어이며 현재 Sun Microsystems는 Oracle이 인수하였다.
Java의 특징
자바를 다른 언어와 구분 짓는 가장 큰 특징은 객체 지향 언어이며 플랫폼(소프트웨어를 실행할 수 있는 기반)에 독립적이라는 것이다.
객체 지향 언어란 객체를 관리하는 것이며하는 것을객체는 데이터(속성)와 기능(행위)로 이루어져 있다.
쉽게 설명하면 TV라는 객체는 전원상태, 채널 정보와 같은 속성을 가지고 있으며 전원 켜기, 전원 끄기, 채널 변경과 같은 행위로 이루어져 있다고 생각하면 된다.
- 객체지향과 반대로 언어로 순서와 절차에 집중을 하며 데이터와 기능을 따로 관리하는 절차 지향 언어가 있으며 절차 지향 언어의 대표적으로 C언어가 있다.
플랫폼에 독립적이라는 것은 서로 다른 하드웨어 아키텍처 및 운영체제에서 동일한 자바 코드를 실행할수 있다는 것을 의미한다. 자바가 플랫폼에 독립적일 수 있는 이유는 JVM(Java virtual machine)이라는 가상 머신을 이용하여 코드를 실행하기 때문이다.
우리가 작성한 C,C++등 소스코드는 기계가 이해할 수 있도록 기계어로 변환해 주어야 한다. 이때 소스코드를 기계어로 변경해 주는과정을 컴파일, 컴파일 프로그램을 컴파일러라 부르며 일반적인 컴파일러는 소스코드를 기계어로 변경해 준다.
그러나 Java는 바이트 코드라는 중간형태로 변경해 주면 JVM이 바이트 코드를 읽고 각 아키텍처 및 OS에 맞는 기계어로 변경해 준다.
- 바이트 코드란 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법
- C, C++ 소스 코드는 하드웨어 아키텍처 및 운영체제에따라 다른 기계코드로 변환되지만 Java 소스코드는 동일한 바이트 코드로 컴파일
Java 파일이 실행 과정
1. javac 컴파일을 이용하여 .java 파일을 바이트 코드인 .class로 변환하여 저장
- javac 컴파일러란 JDK에 포함된 자바 컴파일러로 java 소스코드를 가져와 JVM에서 실행할 수 있는 바이트 코드를 생성
2. JVM이 .class파일을 읽어와 JIT 컴파일러를 사용하여 기계어로 변환
- JIT 컴파일러 : 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환
Java 플랫폼의 핵심 구성 요소
Java를 실행하기 위해서는 JDK를 설치해야 합니다. JDK는 Java Development Kit의 약자로 Java 응용프로그램 및 어플리케이션을 개발하는데 사용되는 소프트웨어 개발 환경입니다. JDK에는 javac, java 등 개발을 위해 필요한 도구와 자바 실행 환경인 JRE를 가지고 있고 JRE는 자바 프로그램을 동작시키는데 필요한 라이브러리와 JVM을 포함하고 있다.
즉 개발이 목적이면 JDK가 필요하고 프로그램 실행이 목적이면 JRE만 있으면 된다.
JDK를 설치하기 위해 오라클 사이트를 접속하면 Java SE, Java EE, Java ME등 다양한 플랫폼이 있으며 사용 목적에 따라 다음과 같이 분류된다.
Java SE는 핵심 Java 프로그래밍 플랫폼으로 라이브러리와 API가 포함되어 있으며 데스크톱 및 서버에서 Java 애플리케이션을 개발하고 배포하는데 사용한다.
Java EE는 Java SE를 기반으로 구축되며 웹 애플리케이션 및 대규모 어플리케이션을 개발하기 위한 API 및 라이브러리를 제공한다.
Java ME는 휴대폰과 같은 소형 장치에서 Java 프로그래밍 언어 응용 프로그램을 실행하기 위한 API 제공한다.
Java 컴파일 및 바이트 코드 확인
컴파일 방법
javac를 이용하여 컴파일 하는 방법은 .java파일이 위치한 폴더에서 javac 파일명.java 를 입력하면 된다.
(터미널에서 FirstJava.java 파일을 컴파일 하는 예제)
javac FirstJava.java
다음과 같이 실행하면 해당 폴더에 .class파일이 생기는 것을 확인할 수 있다.
바이트 코드를 확인하는 방법
.class파일을에 대한 정보를 보고 싶을 경우에는 .class 파일이 있는 폴더에서 javap 명령어를 이용하여 확인할수 있다.
코드가 바이트코드로 어떻게 변경되는지 확인하고 싶을 경우에 javap -c 파일명.class 를 이용하여 확인 할 수 있으며 자세한 정보를 확인하고 싶을 경우 javap -p 파일명.class 명령어를 이용하여 바이트 코드, 상수풀 등 여러가지 정보를 확인할 수 있다.
- 자바 소스 코드
- javap -c 실행 결과
- javap -v 실행 결과
참고
- 자바(위키백과)
- https://www.javatpoint.com/java-architecture
- https://www.geeksforgeeks.org/difference-between-jdk-and-jre-in-java/
- https://docs.oracle.com/javaee/6/firstcup/doc/gkhoy.html
- https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC#%EA%B0%9C%EC%9A%94
- https://docs.oracle.com/javaee/6/firstcup/doc/gkhoy.html
- https://stackoverflow.com/questions/2857376/difference-between-java-se-ee-me
- https://stackoverflow.com/questions/11547458/what-is-the-difference-between-jvm-jdk-jre-openjdk
- https://howtodoinjava.com/java/basics/jdk-jre-jvm/