💡 이 시리즈는 Java 8을 기준으로 작성되었습니다.
자바의 등장 배경과 자바 프로그램 실행 과정
자바 이전에 C라는 언어가 있었다. C언어는 UNIX라는 운영체제를 좀 더 쉽게 개발하기 위해 만들어졌다. 엥? 갑자기 웬 운영체제?라고 한다면, 이 C언어 이전엔 어셈블리어 라는 언어로 UNIX 운영체제가 개발되었다. 어셈블리어는 하드웨어에 종속적인 언어라 운영체제를 컴퓨터에 이식하기 위해선 각 컴퓨터마다 서로 다른 어셈블리어로 작성해야 했다. 이런 불편함을 해결하고자 B언어를 거쳐 1972년 C언어를 개발한다.
https://www.oracle.com/a/ocom/img/rc30v1-java-se.png
하드웨어로부터 독립적인 언어를 만들고자 C언어가 탄생했다면 자바는 여러 플랫폼 에서 독립적으로 실행될 수 있는 프로그램을 위해 만들어졌다. 초기 자바는 다양한 가전제품에서 동작하는 프로그램을 위해 개발되었고 WORA(Write Once Run Anywhere)라는 슬로건을 내세우며 공개되었다. 한 번 작성하고 어느 곳에서나 실행한다는 대체 무슨 말일까? 이를 이해하려면 먼저 “컴파일”이란 단계를 알아야한다.
프로그래밍 언어는 저급 언어(low-level)와 고급 언어(high-level)로 나눌 수 있다. 저급 언어란 컴퓨터가 이해하기 쉽게 작성된 언어(기계어, 어셈블리어)로 사람이 이해하기 쉬운 언어는 고급 언어로 분류된다. 우리가 흔히 사용하는 자바나 C# 같은 언어는 고급 언어로서 컴퓨터가 바로 이해할 수 없기에 따로 “번역"하는 과정이 필요하다. 이 과정을 컴파일이라고 한다. 본래 컴파일이란 어떠한 언어로 작성된 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스이지만 대부분의 경우 고급 언어를 저급 언어로 변환하는 과정을 일컫는다.
C나 C++로 작성된 프로그램은 실행하기 위해 각각의 하드웨어에 맞는 기계어로 컴파일된다. 따라서 다른 하드웨어에서 실행하려면 새로 컴파일해주어야한다. 자바는 처음 시작부터 다양한 기기에서 동작하는 프로그램을 목표로 개발되었기 때문에 각 하드웨어마다 재컴파일해야하는 문제를 JVM(Java Virtual Machine: 자바 가상 머신)으로 해결하였다.
자바로 작성된 프로그램은 곧장 기계어로 컴파일되지 않는다. 대신 JVM이 이해할 수 있는 언어인 자바 바이트코드(Java Bytecode)로 컴파일되고 JVM은 이 자바 바이트코드를 각 하드웨어와 운영체제에 맞춰 실행한다. 이를 두고 자바 응용 프로그램을 플랫폼 독립적이라 한다. 마이크로소프트 PowerPoint로 예를 들어보자면, PowerPoint 프로그램(=자바 실행 환경)은 macOS, Windows, iOS, Android 등 플랫폼별로 다른 버전을 설치해주어야 한다. 하지만 .ppt 확장자를 가진 PowerPoint 파일(=자바 응용 프로그램)은 어디든 PowerPoint가 설치되어 있다면 열 수 있다. macOS용, Windows용 따로 ppt 파일을 만들 필요가 없는 것처럼 플랫폼에 맞는 자바 실행 환경(JRE: Java Runtime Environment)만 갖춰진다면 한번 컴파일된 자바 프로그램(Write Once)은 JVM을 통해 어떤 환경에서든 실행(Run Anywhere)할 수 있다.
자바 프로그램 실행 과정을 간단하게 요약하면 다음과 같이 표현할 수 있다.
https://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html
.java
인 파일을 작성한다. 사람이 읽을 수 있는 프로그래밍 언어로 작성된 문서를 소스 코드라고 한다..class
파일로 변환한다. .class
파일은 하드웨어나 운영체제에 관계없이 JVM에서 실행될 수 있는 바이트코드로만 이루어져있다..class
파일을 JVM에서 타겟 플랫폼에 맞게 실행한다.※ 실제 실행 과정은 https://velog.io/@dev-mage/simply-run-java-on-an-m1-mac 에서 확인
어셈블리어: 실제로 컴퓨터의 CPU가 읽어서 실행할 수 있는 0과 1로 이루어진 명령어의 조합인 기계어와 거의 일대일로 대응되는 저급 언어(low-level language). 기계어는 컴퓨터가 이해하기엔 좋지만 사람이 이해하기에는 매우 어려운 언어이기에 이를 보완하고자 나오게 되었다. 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다.
플랫폼: 응용 소프트웨어를 실행하기 위해 쓰이는 하드웨어와 소프트웨어의 결합. 플랫폼은 하나의 운영 체제 또는 컴퓨터 아키텍처라고 단순히 말할 수 있으며 그 두 가지를 통칭해서 말할 수도 있다. 즉 프로그램이 실행되는 환경인 것이다.
가상 머신: 물리적인 컴퓨터처럼 프로그램을 실행할 수 있는 소프트웨어로 만들어진 컴퓨터. 컴퓨터 안의 컴퓨터라고 볼 수 있다.