자바의 가장 큰 장점 - 운영체제에 독립적이다.[WORA(Write Once, Run Anywhere)]

Java의 JVM WORA(Write Once Run Anywhere)에 대해서 알아보자. WORA라는 개념이 탄생하게 된 배경부터, 왜 JVM의 WORA가 혁신적인지 과거의 이야기부터 차근차근 살펴보자.

1. 기계어 코딩

컴퓨터와 처음 의사소통 했던 시절에는, 개발자들이 기계어를 가지고 컴퓨터에게 복잡한 수식이나 시간이 오래 걸리는 연산 등을 시켰다. 우리가 이미 알다시피 컴퓨터는 멍청해서 0과 1만 알아들을 수 있었다. 따라서 똑똑한 우리 인간이 0과 1을 가지고 나름의 규칙 아래에 ‘명령어(기계어)‘를 만든다. 예를 들어, 1+3 수식의 연산을 명령할 때에 2진법을 이용해서, 계산 기능을 가지고 있는 애드삭이라는 옛날 컴퓨터에서는 0101010101 00000001 00001001 이런 식으로 작성해야했다. 저렇게 1 + 3이라는 간단한 연산을 하기 위해서 눈이 빠지도록 0과 1을 조합해서 코딩을 해야 했던 것이다.

이러한 불편함을 해결하기 위해 어셈블리어라는 프로그래밍 언어가 탄생한다.

2. 어셈블리어

image

어셈블리어는 가독성이 현저히 떨어지는 0과 1의 지옥에서 좀 더 인간이 이해하기 쉬운 뜻이 내포된 단어들을 조합해 기계어 코딩을 대체한다. 위 그림과 같이 어셈블리어라는 프로그래밍 언어가 탄생함으로써, 우리가 어셈블리어로 코딩한 소스를 어셈블러가 기계어 코드로 변환해준다. 결국 컴퓨터는 0과 1로 이루어진 기계어를 다시 전달받는다. 기계어로 코딩했던 개발자들은 어셈블리어가 너무나도 감사했을 것이다.

하지만 어셈블리어도 완벽하게 해결해주지 못한 것이 있었다. 바로 기계에 따라 어셈블리어가 영향을 받는다는 것이었다. 즉 A사에서 만든 컴퓨터, B사에서 만든 컴퓨터에 따라 다른 어셈블리어가 존재하기 때문에 개발자는 모든 컴퓨터에 개발 대응하기 위해 어셈블리어를 따로 공부해야 하고, 컴퓨터마다 바이트 저장 방식이 다르기 때문에 숫자 표기법 또한 모든 컴퓨터마다 각각 따로 습득해야 했다.(모든 컴퓨터들마다 기계어들이 달랐고, 기계어들이 달랐기에 기계어로 변환시키는 어셈블리어도 다 달랐다. 이럴 수 밖에 없었던 이유는 모든 컴퓨터들의 기계어들이 통일되어 있지 않았고, 각 컴퓨터마다 수행하는 기능이 달라서 기계어를 통일하기도 어려웠기 때문이다.)

결국 서로 다른 100개의 컴퓨터가 존재하면 우리는 100개의 다른 어셈블리어로 작성된 소스코드를 작성해야 한다는 것이었다. 이런 불편함을 해결하기 위해 C언어가 탄생하게 된다.

3. C언어

image

C언어는 기존에 있던 어셈블리어의 단점을 보완한다. 단 하나의 소스 코드만 작성하며, 기계에 맞는 컴파일러라는 녀석이 각 기계에 맞는 목적 파일을 만들어 주기 때문이다. 이를 우리는 WOCA(Write Once, Compile Anywhere)라고 한다. 직역하면, ‘한 번만 작성하고 컴파일하면 어디든 사용 가능하다’라고 이해할 수 있다. 즉 하나의 소스로 모든 컴퓨터에서 실행할 수 있도록 했다.

하지만 C언어도 완벽하지 못했다. 컴퓨터를 보면 운영체제가 하드웨어의 특성을 파악하고, 각 운영체제에 맞는 컴파일러가 제공된다. 그런데 운영체제들마다 서로 다른 점들이 존재했기 때문에 하나의 C언어 코드 소스로 컴파일하기 전 각 기종에 맞는 소스를 추가로 수정해야 하는 수고로움이 발생했다. 즉, 하나의 소스 코드만을 작성하면 될 줄 알았는데 결국 각 기계에 맞게 소스 코드를 여전히 수정해야만 했다.

그래도 어셈블리어에 비하면 장족의 발전을 했다. 기종에 따라 다른 종류의 어셈블리어를 배워야 했지만, C언어는 C언어만 배워놓고 운영체제에 따라 다른 점만 코드에서 수정하는 정도로 대폭 공수를 줄인 것이다.

우리가 흔히 C언어의 특성을 이야기 할 대, “이식성이 좋다.”라는 말을 할 때가 있다. 이 말은 다시 말하면 기종마다 소스 코드를 작성해야 하는 어셈블리어보다 하나의 코드 소스만 만들어 놓으면 기종에 상관없이 실행시킬 수 있다는 점을 표현한 말이다. 하지만 이식성이 좋다는 말은 어셈블리어보다 상대적으로 좋다는 말이지, Java보다 C언어가 이식성이 좋다는 말이 아니니 오해하면 안 된다.

위에서 얘기했던 것처럼, 운영 체제에 따라서 소스 코드를 수정해야만 하는 경우가 여전히 발생했다. 이 문제를 해결하기 위해 Java라는 프로그래밍 언어가 등장했다.

참고) C++은 왜 얘기가 빠져있죠 ?

C, C++, Java 순으로 탄생했다. 하지만 C++는 C언어에서 객체지향 개념이 도입된 것이지, 우리가 지금 알아볼 WORA(Write Once Run Anywhere)와는 큰 맥락에서 관련이 없어서 C++은 스킵하도록 하자.

4. Java

드디어 WORA(Write Once Run Anywhere)를 가능하게 한 것이 JAVA의 JRE이다.

C언어에서는 컴파일러를 기종별로 따로 구매하거나 구비해야 했던 불편함에서, Java는 무료로 다른 기종의 컴퓨터를 대응할 수 있도록 해당 컴퓨터 운영체제에 맞는 JRE를 Java 공식 사이트에서 제공해준다.

하나의 자바 소스를 실행하기 위해서 우리는 기종에 맞는 JRE(Java Runtime Environment, 자바 실행 환경)를 한 번만 컴퓨터에 셋팅해주면 된다. JRE 안에서는 JVM과 Java API 등 자바 파일을 실행할 때 도움을 주는 정보들을 포함하고 있다. 여기서 JVM은 말 그대로 자바 가상 기계이다. 즉, 가상의 컴퓨터를 물리적 컴퓨터의 메모리 안에 하나 더 구축하는 것을 뜻한다. (참고로 알아 둘 것은 JVM은 가상이지만, 컴퓨터를 하나 더 만드는 것과 같기 때문에 많은 물리적인 CPU, 메모리가 요구된다.)

Java의 JRE덕분에 기종(플랫폼)에 상관없이 독립적으로 우리는 하나의 자바 소스와 하나의 자바 컴파일러를 통해 코드를 실행시킬 수 있게 되었다. 이를 우리는 WORA(Write Once Run Anywhere)라고 하는 것이다. 즉, 한 번만 작성하면 어디에서든 실행할 수 있게 된 것이다.

정리하자 C언어에서는 기종에 따른 목적 파일(기계어)을 생성했지만, 자바는 목적 파일(바이트 코드 파일, JVM이 인식할 수 있는 언어)을 만들고 실제 물리적인 컴퓨터 내에 자바 언어가 기종에 따라 영향을 받지 않도록 JVM을 이용하여 가상 컴퓨터 환경을 구축하고 그곳에 목적 파일을 던져 자바 코드를 실행하는 것이다.

물리적 컴퓨터 내에 가상적으로 자바소스가 잘 돌아가게끔 환경을 구축하는 것 자체를 JRE를 구축한다고 보면 된다. JRE가 JVM을 포함하고 있는 것이다.


1. 운영 체제에 독립적이다. (자바의 가장 큰 장점!)

C, C++ 각각의 플랫폼(window, mac, 매킨토시 등등)에 따라 코드 및 실행 파일이 다르므로, 플랫폼이 달라지면 컴파일을 새로 해야 한다. 규모가 큰 응용프로그램 같은 경우에는 컴파일을 하는 데 꽤 오랜 시간이 걸린다.

자바의 가장 큰 장점 - 운영체제에 독립적이다.

어떤 플랫폼에도 종속되지 않고 실행될 수 있는 가상 머신용 기계어 코드이다. (**플랫폼 : 개발 환경, 실행 환경 등 어떠한 목적을 수행할 수 있는 환경을 말한다.) → ex : 프로그램이 실행되는 환경인 운영체제들(window, mac), 개발이 수행되는 환경의 종류(안드로이드 스튜디오, 비쥬얼 스튜디오)

References

[Java] JVM WORA (Write Once Run Anywhere)