JDK가 설치된 디렉토리의 bin이라는 하위 디렉토리에 javac.exe와 java.exe파일이 저장 되어 있어야 한다.
java.exe만 있고 javac.exe가 없다면 JDK가 아닌 JRE만 설치된 것이므로 다시 JDK를 설치해야 한다.
JRE는 JDK보다는 작은 개념으로 Java Runtime Environment의 약자이다.
자바가 실행될 수 있는 최소한의 파일들이 설치되어 있는 환경이라고 생각하면 된다.
JRE에는 javac.exe와 같은 자바소스를 컴파일하기 위한 도구는 설치되지 않는다.
javac는 java compiler의 약어이다. 즉, 자바파일을 컴파일할 때 사용하는 것이 바로 javac.exe 파일이다. 컴파일이란 프로그래머가 작성한 소스코드를 컴퓨터가 이해할 수 있는 말(기계어)로 바꾸는 행위이다. 모든 프로그래밍 언어에는 컴파일러 또는 그와 비슷한 기능을 하는 것들이 있다.
자바파일은 작성해야할 자바 프로그램을 말한다.
.java라는 확장자를 가진 파일로 저장하게 되는데 이렇게 저장되는 .java 파일을 자바파일 또는 자바소스라고 한다.
만약 MyProgram.java라는 파일을 작성했다면 프로그램이 정상적으로 동작하는지 확인하기 위해 프로그램을 실행시키고 싶을 것이다. 자바로 작성한 파일을 실행하기 위해서는 두번의 단계를 거쳐야만 한다. 하나는 .java파일을 .class파일로 바꾸어 주는 컴파일 단계이고 두번째는 .class파일을 실행하는 단계이다. 이렇게 두 단계를 거치면 작성한 프로그램을 실행할 수 있다.
위 그림에서 Compiler는 javac.exe에 해당되고 Java VM은 java.exe에 해당된다. 순서대로 서술하면 다음과 같다.
- 소스코드(MyProgram.java)를 작성한다.
- 컴파일러(Compiler)는 자바 소스코드를 이용하여 클래스파일(MyProgram)을 생성한다. 컴파일 된 클래스 파일은 Java VM(Java Virtual Machine)이 인식할 수 있는 바이너리 파일이다.
- Java VM(JVM)은 클래스 파일의 바이너리 코드를 해석하여 프로그램을 수행한다.
- MyProgram 수행 결과가 컴퓨터에 반영된다.
여기서 한 가지 생각해볼 것이 있다. 왜 자바는 컴파일을 하고나면 exe 파일이 아닌class 파일이 생성될까? c또는 c++등으로 작성된 프로그램은 최종 결과물로 exe파일을 만들어 낸다. 이 exe파일은 계산기와 같은 프로그램이거나 게임일 수도 있다. 사용자는 그냥 단순히 exe 프로그램을 실행하기만 하면 프로그램은 실행시켜 볼수 있다.
그런데 왜 자바는 실행하기도 어려운 class라는걸 만드는 걸까?
물론 java도 exe 프로그램으로 만들어 낼 수 있기는 하다. 다만 JVM이 exe에 포함되는 형식으로 가능하기 때문에 exe 파일이 무척이나 커진다는 단점이 있다.
c, c++과 같은 언어는 컴파일 된 실행 파일을 모든 운영체제에서 동일하게 사용하는 것이 불가능하다. 윈도우에서 컴파일한 프로그램을 리눅스에서 사용할 수 없다는 얘기다. 이것은 자바의 JVM과 같은 중간 단계의 역할을 수행하는 것이 없기 때문인데 이 부분에서 서로의 장단점이 명확하게 나누어 진다.
c, c++등의 언어에서 만들어진 실행파일은 JVM같은 중간단계를 거치지 않기 때문에 빠른 속도로 수행된다. 하지만 운영체제마다 별도의 실행파일을 작성해야 한다는 단점이 있다. 반대로 자바는 JVM이라는 중간단계가 있으므로 C언어보다 속도가 느리다. 하지만 한번 작성한 클래스 파일은 어떤 OS에서라도 사용할 수 있다는 장점이 있다. 한번 작성한 것을 널리 재활용하는 것이 자바의 가장 큰 특징이자 가장 큰 장점이라고 할 수 있다.
자바 또한 발전에 발전(JIT의 도입 등)을 거듭하여 실행 속도도 하드웨어를 직접 제어하는 케이스만 아니라면 c/c++에 거의 근접하게 따라잡았다.
'Language > Java' 카테고리의 다른 글
[Java] 배열 (Array) 기초 (0) | 2022.07.30 |
---|---|
[Java] Java기초 (0) | 2022.07.30 |
[Java] Array 실습 (동전) (0) | 2022.07.28 |
[Java] Array 실습 (length) (0) | 2022.07.28 |
[Java] Array 내림차순 (0) | 2022.07.28 |