[Java] 컴파일(Compile) 개념과 자바 컴파일 이해하기
자바(Java)의 경우 컴파일(Compile)이라는 개념이 들어갑니다. 파이썬(Python)과 같은 언어는 컴파일 언어와 다르게 인터프리터 언어로 별도의 컴파일 과정이 없이 소스 코드를 한줄 한줄 읽어가면서 실행을 하게 되지만, 자바의 경우 컴퓨터가 읽기 전에 컴파일 과정이 우선 적용된 후 컴퓨터가 이해를 하는 방식입니다.
컴파일 언어의 장점
컴파일 언어의 장점은 대척점에 있는 인터프리터의 단점과 같습니다. 소스 코드라는 것은 사람이 읽기 쉬운 언어의 모음이며, 컴퓨터의 경우 한줄 한줄 해석을 하다보면 시간이 오래 걸리는 단점이 존재합니다. 컴파일은 바로 사람이 읽기 쉬운 소스 코드를 컴퓨터가 읽기 쉽게 변환해주는 개념입니다.
컴퓨터의 언어도 Language 이기 때문에 결국 통역이라는 과정이 필요하게 될텐데요 이를 실생활로 비교하면 아래와 유사합니다.
위와 같이 독일인이 자국의 언어로 우리한테 말을 하면 우리는 그 말을 이해하기 위해서 사전을 찾아봐야 될 것입니다. 이때 독일인을 소스 코드로 보고, 한국인을 컴퓨터로 대입을 시키면 좀 이해가 쉬울 겁니다. 여기에 한국인(컴퓨터)에게 책임을 전가하는 것이 인터프리터 언어가 되며, 당연히 소스 코드를 이해하는데 시간이 걸릴 것입니다.
반대로 컴파일 언어의 경우 책임 전가가 소스 코드 즉, 개발자에게 있습니다. 컴퓨터에게 넘기기 전에 컴퓨터가 이해하기 쉬운 형태로 변환을 시켜주는 개념인 것이죠.
한마디로 컴파일 과정은 컴퓨터에게 배려를 하는 과정이라고 봐도 무방합니다. 컴퓨터에게 불필요한 일을 줄여서 컴퓨터의 속도를 올려주게 되는 것이죠.
자바 컴파일러와 JVM
그렇다면 자바 컴파일은 다른 컴파일 언어와 무슨 차이점이 있는지를 보겠습니다. 사실, 자바 컴파일러의 경우 다른 컴파일 언어와 차이점이 있다기 보다, 자바 컴파일러의 장점이 많이 뜨게 되면서 최근 등장하는 컴파일 언어의 상당수가 자바와 같은 방식을 취하고 있습니다. 그러니, 정확한 워딩은 자바 컴파일과 고전적인 언어의 컴파일 과정의 차이가 무엇인지라고 하는게 옳겠네요.
자바 컴파일의 가장 큰 특징은 바로 JVM(Java Virtual Machine)의 존재입니다. JVM은 별도로 다뤄야 할 주제이니 여기서는 간단한 개념만 적어보자면, 자바의 컴파일을 해석해주는 녀석이라고 보시면 됩니다.
컴파일은 컴퓨터에 맞는 언어로 해석을 해주게 되는데 컴퓨터의 언어는 결국 OS(Operating System)입니다. 이 OS를 다시 이해하자면, 각기 다른 나라의 사람이라고 이해를 하면 좋겠네요.
윈도우즈(Windows) 사람이 있고, 리눅스(Linux) 사람이 있고, 유닉스(Unix) 사람이 있는 등... 수많은 OS 사람이 있는데 이 OS에 맞게 컴파일을 시켜줘야 하는것이 기존의 전통적인 컴파일입니다. 그래서 기존 프로그램 들은 OS를 지원하지 않는 프로그램들이 많은 것입니다.
이와 같은 불편하고 효율적이지 않은 컴파일의 문제점을 개선하는 것이 JVM이며, JVM은 수많은 사람들에게 자동번역기를 제공해주는 통역의 역할을 수행합니다. 즉, 독일인이 아무리 독일어로 말해도 번역을 해주면서 우리에게 한국어로 말해준다는 것이죠.
자바 컴파일 과정
이렇게 JVM과 같은 존재로 인해서, 자바와 같은 Virtual Machine 기반의 컴파일 언어는 다음과 같은 독특한 개념이 추가 됩니다.
- 자바에서 컴파일은 JVM을 대상으로 하는 컴파일이며, 이때 나오는 코드를 .class 파일로 바이트코드(Bytecode)라 합니다
- 바이트코드에는 클래스들을 연결하는 링크들이 포함됩니다
즉 자바 컴파일의 경우, 하나의 완벽한 파일을 만드는 것이 아니라 JVM이 이해할 수 있는 수준으로 분해하고 조립에 대한 설명이 있는 설명서의 개념이라 생각하면 좋을 것 같습니다. JVM은 바이트코드, 즉 설명서를 기반으로 프로그램을 메모리에 올리게 되며 실행을 하게 됩니다.
참고자료
[1] 위키피디아 - 컴파일언어, https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8C%8C%EC%9D%BC_%EC%96%B8%EC%96%B4