프로그래밍 언어는 컴파일 언어와 인터프리터 언어로 분류할 수 있습니다.
현재 백엔드 개발을 위해 사용하고 있는 자바는 둘 중 어디에 해당하는지 궁금해졌습니다.
이 글에서는 컴파일 언어와 인터프리터 언어의 차이를 살펴보고, 자바를 이 관점에서 어떻게 이해할 수 있는지 정리해보았습니다.
01 프로그래밍 언어의 분류
1. 컴파일 언어란?
컴파일 언어는 소스 코드를 기계어로 변환하는 컴파일러를 사용하여 프로그램을 실행합니다.
컴파일 언어의 특징은 다음과 같습니다.
- 컴파일 과정: 전체 소스 코드를 한 번에 번역하여 실행 가능한 파일을 생성합니다.
- 빠른 실행 속도: 기계어로 변환된 실행 파일을 사용하기 때문에 실행 속도가 빠릅니다.
- 플랫폼 의존성: 컴파일된 파일은 특정 운영 체제와 하드웨어에서만 실행됩니다.
대표적인 컴파일 언어로는 C와 C++이 있습니다.
2. 인터프리터 언어란?
인터프리터 언어는 소스 코드를 실행할 때 한 줄씩 읽고 해석하며 실행합니다.
인터프리터 언어의 특징은 다음과 같습니다:
- 동적 실행: 실행 중에 코드를 분석하고 실행하기 때문에 컴파일 과정이 필요 없습니다.
- 느린 실행 속도: 코드가 한 줄씩 해석되기 때문에 컴파일 언어보다 속도가 느립니다.
- 플랫폼 독립성: 인터프리터만 존재한다면 어떤 플랫폼에서도 실행할 수 있습니다.
대표적인 인터프리터 언어로는 Python과 JavaScript가 있습니다.
02 자바는 컴파일 언어일까?

자바를 실행하는 과정을 생각해봅시다.
자바의 소스 코드는 먼저 Javac라는 컴파일러를 통해 바이트코드로 변환됩니다.
바이트코드는 기계어가 아닌 중간 단계의 코드로, 특정 플랫폼에 종속되지 않는 것이 특징입니다.
컴파일 언어의 관점에서 보면 자바는 다음과 같은 특징을 가집니다:
- 소스 코드를 바이트코드로 변환하여 저장합니다 (예: .class 파일)
- 동일한 바이트코드를 다양한 운영 체제에서 사용할 수 있습니다.
하지만 바이트코드는 실행을 위해 JVM(Java Virtual Machine)이 필요하여 곧바로 실행되는 것은 아닙니다.
즉, 자바는 컴파일 언어라고만 볼 수는 없습니다.
03 자바는 인터프리터 언어일까?
JVM은 자바 바이트코드를 실행하는 역할을 합니다.
이 과정에서 JVM은 바이트코드를 읽어 해석하고 실행하는 인터프리터의 역할을 수행합니다.
그러나 자바는 단순한 인터프리터 언어로 보기 어렵습니다.
그 이유는 JIT(Just-In-Time) 컴파일러의 존재 때문입니다.
- JIT 컴파일러: JVM은 실행 중에 자주 사용되는 바이트코드를 기계어로 변환하여 캐싱합니다. 이렇게 하면 실행 속도가 빨라집니다.
- 인터프리터와 컴파일러의 결합: JVM은 초기에는 인터프리터로 작동하다가 JIT 컴파일러를 통해 최적화를 진행합니다.
이러한 점에서 자바는 단순히 인터프리터 언어로 분류될 수 없습니다.
04 자바는 혼합형 언어
자바는 컴파일 언어와 인터프리터 언어의 특징을 모두 가진 독특한 언어입니다.
자바의 장점
- 플랫폼 독립성: "Write Once, Run Anywhere"라는 자바의 철학은 바이트코드와 JVM의 협력을 통해 완벽히 구현되었습니다. 이로 인해 자바는 다양한 운영 체제에서 동일한 동작을 보장합니다.
- 최적화된 성능: JIT(Just-In-Time) 컴파일러는 실행 중 바이트코드를 기계어로 변환하여 반복적으로 실행되는 코드의 성능을 극대화합니다. 이는 인터프리터 기반 언어들보다 훨씬 효율적인 실행을 가능하게 합니다.
- 유연성: 초기 실행 단계에서 인터프리터가 제공하는 빠른 피드백을 통해 개발자의 생산성을 높이고, JIT 컴파일러로 최적화를 진행하여 런타임 성능을 극대화합니다. 이는 개발과 실행 모두에서 최상의 결과를 보장합니다.
결론
자바는 전통적인 의미에서의 컴파일 언어와 인터프리터 언어 어느 쪽에도 속하지 않습니다.
대신, 두 가지 방식의 장점을 결합한 혼합형 언어로 볼 수 있습니다.
컴파일 언어의 성능과 인터프리터 언어의 유연성을 동시에 제공하여 여러 장점을 가지고 있습니다.
자바가 아닌 언어 중에서도 이렇게 혼합 방식을 적용해 성능을 크게 향상시킨 사례가 있습니다.
예를 들어 Python은 JIT 컴파일러를 활용해 PyPy 에서 성능을 향상시켰습니다.
기술이 발전함에 따라 혼합형 언어가 점점 더 등장할 것이라 생각합니다.
'Fundamentals > Computer Science' 카테고리의 다른 글
[운영체제] 자바의 스레드와 멀티스레드 기본 개념 (2) | 2025.01.21 |
---|---|
[네트워크] 로드밸런싱의 정의와 알고리즘 (0) | 2025.01.06 |
[네트워크] HTTP의 정의와 HTTP 메서드의 속성 (3) | 2024.12.20 |
[네트워크] TCP 기반 웹소켓 기술 (1) | 2024.12.16 |
[네트워크] 네트워크 계층에서의 QoS 관리 (1) | 2024.12.12 |