자바 교재, 전공 수업 등 학습을 할 때 항상 자바의 장점으로 “플랫폼에 독립적이라서 어떤 플랫폼에서도 동일하게 실행될 수 있다.” 라는 말을 봐왔다. 처음 공부할 때는 그러려니 하고 넘어갔는데, 최근에는 기술의 원리에 대한 공부를 하기 시작하면서 이 부분에 흥미가 생겼다.
플랫폼에 독립적인 것이 왜 장점이지?
플랫폼은 뭐지?
자바는 어떻게 이것을 가능하게 할까?
라는 질문들에서 시작해 여기까지 오게 됐다.
일단 자바로 만들어진 프로그램은 코드를 한 번 작성하면 특정 운영체제나 하드웨어에 구애받지 않고 다양한 환경에서 실행할 수 있다.
따라서 "자바가 플랫폼 독립적이다."라고 할 때의 플랫폼은 운영체제와 하드웨어 환경을 의미한다.
플랫폼 그러니까, 운영체제에 독립적이라는 것은 프로그램을 수정하지 않고도 다양한 운영체제에서 그대로 실행할 수 있다는 것이다.
그럼 단순하게 생각해서 개발 비용이 절감된다는 장점이 있다. 운영체제마다 별도의 코드를 작성할 필요가 없어서 코드 재사용성을 높여주기 때문이다.
나는 이 점이 잘 이해가 안됐다. 거의 자바만을 사용해왔고, C++을 사용할 때는 알고리즘 문제를 풀 정도의 문법만 사용했기 때문이다. C++에서는 시스템 API(파일 접근, GUI 프로그램 작성 등)에 접근할 때, 운영체제마다 다른 코드를 사용하고, 특정 플랫폼에서만 지원하는 라이브러리가 있는 등의 특징이 있다.
// c++에서 조건부 컴파일
#ifdef _WIN32
// Windows용 코드
system("cls");
#else
// Unix 계열 운영체제용 코드
system("clear");
#endif
자바는 이러한 점을 완전히 추상화한다. 즉, 개발자가 운영체제마다 다른 코드를 작성할 필요가 거의 없다는 뜻이다.
이러한 이유로 개발 비용이 크게 줄어든다.
결론부터 말하면 JVM(Java Virtual Machine) 덕분이다.
자바와 다른 언어, 정확히는 JVM 기반의 언어 vs 다른 언어(어쩌면 자바와 비슷한 철학을 가지는 언어 vs 그 외의 언어)는 어떤 차이가 있을까?
바로 프로그램을 실행하는 과정에서 차이가 있다.
C++의 실행파일을 만드는 과정을 살펴보자.
간단하게 말하자면, 컴파일하면 그 플랫폼에 맞는 기계어 코드가 만들어지고 링킹이라는 과정을 통해서 플랫폼에서 실행될 수 있는 실행 파일을 만든다. 그리고 이 실행 파일을 실행하면 프로그램이 실행된다.
다음, 자바를 살펴보자. 자바는 별도의 실행 파일을 만들지 않는다. (.jar는 문맥상 다른 파일이다.)
이처럼 특정 플랫폼에 종속적인 실행 파일을 만들어서 실행하는 것이 아니라, 바이트 코드를 생성하기만 하면 이를 JVM이 플랫폼에 맞게 해석하고 실행해주기 때문에 플랫폼에 독립적이다 라는 말을 하는 것이다.
자바의 플랫폼 독립성에 대해 알아보았다. 이러한 추상화를 가능하게 하는 것은 JVM이었다. 그 운영체제에 맞는 JVM만 있다면 개발자는 플랫폼을 신경쓰지 않고 개발을 할 수 있다.
문득 든 생각이 flutter나 react native와 같이 크로스 플랫폼을 지원하는 기술도 비슷한 원리로 돌아가지 않을까 싶다. 컴파일하면 어떠한 중간 파일을 만들고 Virtual Machine을 통해 운영체제에 상관없이 앱을 만들어주는 것이다. 이건 학습에 기반한 뇌피셜이기 때문에 추가적으로 알아봐야할 것 같다.
최초 작성일: 2024.11.10