본론을 알아보기 전에 컴파일러와 인터프리터가 무엇인지 확인할 필요가 있다.
컴파일러
컴파일러는 한 프로그래밍 언어의 코드를 다른 프로그래밍 언어로 변환하는 컴퓨터 유형이다.
프로그램 기능을 유지하면서 고급 코드를 저급 코드(예: 어셈블리어 언어, 기계어 등)로 변환하는 데 사용된다.
컴파일러 역할
어휘분석, 구문분석, 의미분석, 중간 코드 생성, 최적화, 기계어 코드 생성 등을 수행한다.
어휘 분석은 소스코드를 구성하는 문자들을 단어로 분리하여 어휘 요소로 만든다.
구문 분석은 어휘 요소들을 문장으로 구성하여 문법적으로 검사하고, 이를 트리 형태로 만들어 분석한다.
의미 분석은 문장이 의미적으로 올바른지 검사하고, 변수의 정의와 사용, 함수 호출 등을 분석한다.
중간 코드 생성은 검증된 소스 코드를 이해하기 쉬운 중간 코드 형태로 변환하고 실행할 수 있도록 최적화한다.
최적화한 중간 코드를 기계어 코드로 번역하여 실행 파일로 만든다.
여기서 중간 코드(IR)는 사람이 작성한 소스 코드를 CPU가 이해할 수 있는 기계어로 바로 변환하기 전, 컴파일러가 중간 단계에서 사용하는 추상적인 형태의 코드이다. JVM은 바이트 코드라는 중간 코드를 생성한다.
장단점
장점
- 소스 코드와 별도로, 실행 파일이 생성된다.
자바는 Javac 컴파일러를 통해 .class 파일을 생성하고 실행한다. - 속도가 상대적으로 빠르다.
컴파일러가 소스 코드 전체를 분석하고 최적화하기 때문에 인터프리터보다 빠르다.
단점
- 디버깅 난이도가 높다.
오류가 발생하면, 어디서 오류가 발생했는지 오류 지점을 찾아야 하기 때문에 인터프리터보다 난이도가 높다. - 이식성이 상대적으로 나쁘다.
컴파일러를 통한 별개의 실행 파일은 특정 플랫폼(자바인 경우, JVM)을 통해 실행되기 때문에 이식성이 낮을 수 있다.
인터프리터
현재 프론트엔드에서 사용하는 JS와 AI 분야로 더욱 상승세를 탄 Python, 많은 데이터를 관리할 수 있는 SQL 등이 인터프리터 언어이다.
프로그래밍 언어의 소스 코드를 한 줄씩 읽어 기계어로 번역하고 바로 실행하는 프로그램이다.
컴파일러와 다르게 플랫폼 독립성이 높다.
동적 타이핑으로 런타임에 타입이 결정되는 경우가 많아 유연하지만 실수 가능성이 있다.
VSCode의 Live Server처럼 수정 후 바로 실행 가능하다.
장단점
장점
- 개발 속도가 빠르다.
빌드 과정이 없기 때문에 라이브 테스트가 가능하다. - 이식성이 높다.
OS와 하드웨어에 종속되어 있지 않아 인터프리터만 있으면 실행 가능하다.
파이썬은 구글의 코랩, 쥬피터 노트북, 아나콘다(미니콘다), VSCode 등 어디서나 가능하다. - 유연함이 크다.
런타임 타입 결정, 동적 메모리 관리가 쉽다. - REPL을 지원한다.
JS 콘솔이나 파이썬 셸처럼 한 줄씩 실행하고 즉시 테스트가 가능하다. - 일부 영역에서 생산성이 높다.
스크립트 자동화, 웹 개발, 프로토타입 개발에 강하다.
단점
- 실행 속도가 컴파일러보다 느리다.
한 줄씩 실행하며, 매 실행시 코드를 해석해야 하기 때문이다. - 런타임 오류 증가 가능성이 있다.
런타임 시 타입이 결정되므로, 소스 코드 해석의 실수 가능성이 있다. - 최적화가 제한적이다.
코드가 실행 전 분석되지 않기 때문에, 컴파일러 수준의 최적화처럼 불가능하다. - 런타임 하려면 인터프리터 설치 의존성이 높다.
실행하려면 반드시 해당 언어의 인터프리터가 필요하다. - 대구모 고성능 애플리케이션에 적합하지 않다.
대규모 연산 또는 실시간 처리는 컴파일 언어에 비해 비효율적이다.
자바
자바는 컴파일과 인터프리터를 모두 진행하는 하이브리드 언어이다.

우리가 작성한 .java 파일들을 실행할 경우, 곧바로 외부 정적 컴파일러인 javac가 컴파일을 하여, .class 파일로 변환한다. 이 파일이 바이트 코드이며 중간 코드이다.
.class 바이트코드는 JVM의 인터프리터가 한 줄씩 해석해서 실행하고, 자주 실행되는 코드는 JIT 컴파일러가 기계어로 변환하여 최적화한다.
면접 답변식 요약
자바는 인터프리터와 컴파일러를 모두 사용하는 하이브리드 언어입니다.
개발자가 작성한 고급 소스 코드(.java 파일)는 javac 컴파일러를 통해 바이트코드(.class 파일)로 변환됩니다.
생성된 .class 파일은 JVM 내부에서 인터프리터가 한 줄씩 읽어 실행하고, 자주 실행되는 반복적인 코드는 JIT 컴파일러가 네이티브 코드로 변환하여 OS에 전달함으로써 실행 속도를 최적화합니다.
'Daily Dev Q&A 정리 템플릿' 카테고리의 다른 글
| 25.12.01 객체지향 언어 개념과 자바는 어떤 언어인가 (0) | 2025.12.01 |
|---|---|
| 25.11.28 자바의 예외 처리(Exception)에 대하여 (0) | 2025.11.30 |
| 25.11.26 자바 메모리 구조 (0) | 2025.11.26 |
| 25.11.25 JAVA의 GC(Garbage Collection) (0) | 2025.11.25 |
| 25.11.24 JVM이란? (0) | 2025.11.24 |